繁体   English   中英

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

[英]IN-clause in HQL or Java Persistence Query Language

我有以下参数化的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样式参数。

您是否正在使用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);

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

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

现在至少不使用括号,而仅调用“ setParameter”即可与Hibernate一起使用。

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

结合使用纯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;
    }
}

query.setParameterList(“ name”,new String [] {“ Ron”,“ Som”,“ Roxi”})); 解决了我的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM