HQL 或 Java 持久性查询语言中的 IN 子句
Posted
技术标签:
【中文标题】HQL 或 Java 持久性查询语言中的 IN 子句【英文标题】:IN-clause in HQL or Java Persistence Query Language 【发布时间】:2011-06-17 05:10:58 【问题描述】:我有以下参数化的 JPA 或 Hibernate 查询:
SELECT entity FROM Entity entity WHERE name IN (?)
我想将参数作为 ArrayList
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
这可能吗?
解答:作为参数的集合仅适用于“:name
”等命名参数,不适用于“?
”等 JDBC 样式参数。
【问题讨论】:
您介意添加您对这个问题的答案吗?我知道这是一个旧问题,但不仅允许自行回答您的问题,而且明确鼓励这样做。 【参考方案1】:在 HQL 中,您可以使用查询参数并通过 setParameterList 方法设置集合。
Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
q.setParameterList("names", names);
【讨论】:
【参考方案2】:您使用的是 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);
【讨论】:
好吧,问题出在使用?来指定参数。使用 :peter 之类的命名参数可以正常工作。 所以您不需要列表中每个字符串的引号? 如何设置String[]数组作为查询参数 您可以将其转换为列表:List<String> list = Arrays.asList(yourArray);
IMP:旧版本的休眠需要括号。较新的版本将不支持 () - 至少在我的情况下。另外,请参阅此解决方案***.com/a/21341663/6043669【参考方案3】:
使用带有 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;
道.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】:省略括号并简单地调用“setParameter”现在至少适用于 Hibernate。
String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
【讨论】:
【参考方案5】:query.setParameterList("name", new String[] "Ron", "Som", "Roxi");解决了我的问题
【讨论】:
以上是关于HQL 或 Java 持久性查询语言中的 IN 子句的主要内容,如果未能解决你的问题,请参考以下文章
hibernate hql case when 子查询报java.lang.NullPointerException错误