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 子句的主要内容,如果未能解决你的问题,请参考以下文章

[转]HQL中的子查询

Hibernate HQL中的子查询

hql和sql的区别

HQL

hibernate hql case when 子查询报java.lang.NullPointerException错误

HQL数据查询基础