2011-01-28 44 views
64

Tôi có parametrised JPA, hoặc Hibernate, truy vấn sau đây:IN-điều khoản trong HQL hoặc Java Persistence Query Language

SELECT entity FROM Entity entity WHERE name IN (?) 

Tôi muốn vượt qua các tham số như một ArrayList < String>, có thể như vậy? Dòng Hibernate cho tôi biết rằng,

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

Điều này có thể thực hiện được không?

TRẢ LỜI: Bộ sưu tập dưới dạng tham số chỉ hoạt động với các tham số có tên như ":name", chứ không phải với tham số kiểu JDBC như "?".

+1

Bạn có muốn thêm câu trả lời cho câu hỏi này không? Tôi biết nó là một cái cũ, nhưng tự trả lời câu hỏi của bạn không chỉ được phép, nó được khuyến khích một cách rõ ràng. – Makoto

Trả lời

123

Bạn đang sử dụng đối tượng Hibernate's Query hoặc JPA? Đối với JPA, nó sẽ làm việc tốt:

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

cho Hibernate, bạn sẽ cần phải sử dụng setParameterList:

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

Okey, vấn đề đang sử dụng? để chỉ định các tham số. Với các tham số có tên như: peter công trình này. – Daniel

+0

vì vậy bạn không cần dấu ngoặc kép cho mỗi chuỗi trong danh sách? – CCC

+0

Cách đặt chuỗi String [] làm tham số truy vấn – priyadarshini

18

trong HQL bạn có thể sử dụng tham số truy vấn và đặt Bộ sưu tập bằng phương thức setParameterList.

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

Sử dụng tinh khiết JPA với Hibernate 5.0.2.Final là nhà cung cấp thực tế sau đây dường như làm việc với các thông số vị trí cũng như:

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

Rời ra ngoặc và chỉ cần gọi 'setParameter' hiện đang làm việc với ít nhất Hibernate.

String jpql = "from A where name in :names"; 
Query q = em.createQuery(jpql); 
q.setParameter("names", l); 
Các vấn đề liên quan