HQL或Java持久性查询语言中的IN子句
我有以下参数化JPA或Hibernate查询:HQL或Java持久性查询语言中的IN子句,java,hibernate,jpa,hql,jpql,Java,Hibernate,Jpa,Hql,Jpql,我有以下参数化JPA或Hibernate查询: SELECT entity FROM Entity entity WHERE name IN (?) 我想将参数作为ArrayList传递,这可能吗?冬眠电流告诉我 java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String 这可能吗 ANSWER:集合作为参数仅适用于命名参数,如“:name”,而不适用于JDBC样式的参数,如“?””
SELECT entity FROM Entity entity WHERE name IN (?)
我想将参数作为ArrayList传递,这可能吗?冬眠电流告诉我
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
这可能吗
ANSWER:集合作为参数仅适用于命名参数,如“
:name
”,而不适用于JDBC样式的参数,如“?
””在HQL中,您可以使用查询参数并使用setParameterList方法设置集合
Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
q.setParameterList("names", names);
在HQL中,您可以使用查询参数并使用setParameterList方法设置集合
Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
q.setParameterList("names", names);
您使用的是Hibernate的
查询
对象还是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);
您使用的是Hibernate的
查询
对象还是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);
使用带Hibernate 5.0.2.Final的纯JPA作为实际提供程序,以下似乎也适用于位置参数:
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;
}
}
公共类Dao{
公共列表FindByatAttribute(设置属性){
Query Query=em.createNamedQuery(“byAttributes”);
query.setParameter(1,属性);
List entities=query.getResultList();
返回实体;
}
}
使用带Hibernate 5.0.2.Final的纯JPA作为实际提供程序,以下似乎也适用于位置参数:
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;
}
}
公共类Dao{
公共列表FindByatAttribute(设置属性){
Query Query=em.createNamedQuery(“byAttributes”);
query.setParameter(1,属性);
List entities=query.getResultList();
返回实体;
}
}
省去括号,只需调用“setParameter”现在至少可以在Hibernate中使用
String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
省略括号并简单地调用“setParameter”现在至少可以在Hibernate中使用
String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
setParameterList(“name”,新字符串[]{“Ron”,“Som”,“Roxi”});修复了我的问题query.setParameterList(“name”,新字符串[]{“Ron”,“Som”,“Roxi”});修复了我的问题好的,问题是使用?指定参数。对于命名参数,如:peter,这是可行的。因此,列表中的每个字符串都不需要引号?如何将string[]数组设置为查询参数您可以将其转换为列表:
list list list=Arrays.asList(yourArray)代码>IMP:旧版本的hibernate需要括号。较新的版本将不支持()-至少在我的情况下是这样。还有,看到这个解决方案了吗?好的,问题在用什么?指定参数。对于命名参数,如:peter,这是可行的。因此,列表中的每个字符串都不需要引号?如何将string[]数组设置为查询参数您可以将其转换为列表:list list list=Arrays.asList(yourArray)代码>IMP:旧版本的hibernate需要括号。较新的版本将不支持()-至少在我的情况下是这样。此外,请参阅此解决方案。您介意为这个问题添加您的答案吗?我知道这是一个老问题,但自答你的问题不仅是允许的,而且是明确鼓励的。你介意为这个问题添加你的答案吗?我知道这是一个老问题,但自我回答你的问题不仅是允许的,而且是明确鼓励的。