我有以下参数化的JPA或Hibernate查询:
SELECT entity FROM Entity entity WHERE name IN (?)
我想将参数作为ArrayList< String>传递,这可能吗? Hibernate电流告诉我,
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
这有可能吗?
ANSWER :作为参数的集合仅适用于“:name
”之类的命名参数,而不适用于“?
”等JDBC样式参数。
答案 0 :(得分:141)
您使用的是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);
答案 1 :(得分:19)
在HQL中,您可以使用查询参数并使用setParameterList方法设置Collection。
Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
q.setParameterList("names", names);
答案 2 :(得分:4)
离开括号并简单地调用'setParameter'现在至少可以使用Hibernate。
String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
答案 3 :(得分: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;
}
}
答案 4 :(得分:0)
query.setParameterList(“ name”,new String [] {“ Ron”,“ Som”,“ Roxi”}));解决了我的问题