簡體   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