HQL或Java持久性查询语言中的条款


78

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

SELECT entity FROM Entity entity WHERE name IN (?)

我想将参数作为ArrayList <String>传递,这可能吗?休眠电流告诉我,

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String

这有可能吗?

回答:集合作为参数只能与“ :name”这样的命名参数一起使用,而不能与“ ”这样的JDBC样式参数一起使用?


2
您介意为这个问题添加答案吗?我知道这是一个古老的问题,但是不仅允许您回答自己的问题,而且还特别建议您这样做。
Makoto 2015年

Answers:


155

您正在使用Hibernate的Query对象还是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);

Okey,问题出在用吗?指定参数。使用像:peter这样的命名参数,可以正常工作。
丹尼尔(Daniel)

这样您就不需要列表中每个字符串的引号了吗?
CCC 2013年

如何将String []数组设置为查询参数
priyadarshini

1
您可以将其转换为列表:List<String> list = Arrays.asList(yourArray);
MarkyDD '17

1
IMP:较旧的休眠版本需要括号。较新的版本将不支持()-至少就我而言。另外,请参阅此解决方案stackoverflow.com/a/21341663/6043669
HopeKing

23

在HQL中,可以使用查询参数,并使用setParameterList方法设置Collection。

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

5

现在至少不用Hibernate就能省略括号并简单地调用“ setParameter”。

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

3

将纯JPA与Hibernate 5.0.2.Final一起用作实际提供程序,以下内容似乎也适用于位置参数:

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;
    }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.