HQL或Java持久性查询语言中的IN子句

HQL或Java持久性查询语言中的IN子句,java,hibernate,jpa,hql,jpql,Java,Hibernate,Jpa,Hql,Jpql,我有以下参数化JPA或Hibernate查询: SELECT entity FROM Entity entity WHERE name IN (?) 我想将参数作为ArrayList传递,这可能吗?冬眠电流告诉我 java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String 这可能吗 ANSWER:集合作为参数仅适用于命名参数,如“:name”,而不适用于JDBC样式的参数,如“?””

我有以下参数化JPA或Hibernate查询:

SELECT entity FROM Entity entity WHERE name IN (?)
我想将参数作为ArrayList传递,这可能吗?冬眠电流告诉我

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
这可能吗


ANSWER:集合作为参数仅适用于命名参数,如“
:name
”,而不适用于JDBC样式的参数,如“

在HQL中,您可以使用查询参数并使用setParameterList方法设置集合

    Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
    q.setParameterList("names", names);

在HQL中,您可以使用查询参数并使用setParameterList方法设置集合

    Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
    q.setParameterList("names", names);

您使用的是Hibernate的
查询
对象还是JPA?对于JPA,它应该可以正常工作:

String jpql = "from A where name in (:names)";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
对于Hibernate,您需要使用setParameterList:

String hql = "from A where name in (:names)";
Query q = s.createQuery(hql);
q.setParameterList("names", l);

您使用的是Hibernate的
查询
对象还是JPA?对于JPA,它应该可以正常工作:

String jpql = "from A where name in (:names)";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
对于Hibernate,您需要使用setParameterList:

String hql = "from A where name in (:names)";
Query q = s.createQuery(hql);
q.setParameterList("names", l);
使用带Hibernate 5.0.2.Final的纯JPA作为实际提供程序,以下似乎也适用于位置参数:

Entity.java:

@Entity
@NamedQueries({
    @NamedQuery(name = "byAttributes", query = "select e from Entity e where e.attribute in (?1)") })
public class Entity {
    @Column(name = "attribute")
    private String attribute;
}
Dao.java:

public class Dao {
    public List<Entity> findByAttributes(Set<String> attributes) {
        Query query = em.createNamedQuery("byAttributes");
        query.setParameter(1, attributes);

        List<Entity> entities = query.getResultList();
        return entities;
    }
}
公共类Dao{
公共列表FindByatAttribute(设置属性){
Query Query=em.createNamedQuery(“byAttributes”);
query.setParameter(1,属性);
List entities=query.getResultList();
返回实体;
}
}
使用带Hibernate 5.0.2.Final的纯JPA作为实际提供程序,以下似乎也适用于位置参数:

Entity.java:

@Entity
@NamedQueries({
    @NamedQuery(name = "byAttributes", query = "select e from Entity e where e.attribute in (?1)") })
public class Entity {
    @Column(name = "attribute")
    private String attribute;
}
Dao.java:

public class Dao {
    public List<Entity> findByAttributes(Set<String> attributes) {
        Query query = em.createNamedQuery("byAttributes");
        query.setParameter(1, attributes);

        List<Entity> entities = query.getResultList();
        return entities;
    }
}
公共类Dao{
公共列表FindByatAttribute(设置属性){
Query Query=em.createNamedQuery(“byAttributes”);
query.setParameter(1,属性);
List entities=query.getResultList();
返回实体;
}
}

省去括号,只需调用“setParameter”现在至少可以在Hibernate中使用

String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);

省略括号并简单地调用“setParameter”现在至少可以在Hibernate中使用

String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);

setParameterList(“name”,新字符串[]{“Ron”,“Som”,“Roxi”});修复了我的问题

query.setParameterList(“name”,新字符串[]{“Ron”,“Som”,“Roxi”});修复了我的问题

好的,问题是使用?指定参数。对于命名参数,如:peter,这是可行的。因此,列表中的每个字符串都不需要引号?如何将string[]数组设置为查询参数您可以将其转换为列表:
list list list=Arrays.asList(yourArray)IMP:旧版本的hibernate需要括号。较新的版本将不支持()-至少在我的情况下是这样。还有,看到这个解决方案了吗?好的,问题在用什么?指定参数。对于命名参数,如:peter,这是可行的。因此,列表中的每个字符串都不需要引号?如何将string[]数组设置为查询参数您可以将其转换为列表:
list list list=Arrays.asList(yourArray)IMP:旧版本的hibernate需要括号。较新的版本将不支持()-至少在我的情况下是这样。此外,请参阅此解决方案。您介意为这个问题添加您的答案吗?我知道这是一个老问题,但自答你的问题不仅是允许的,而且是明确鼓励的。你介意为这个问题添加你的答案吗?我知道这是一个老问题,但自我回答你的问题不仅是允许的,而且是明确鼓励的。