JPQL IN 子句:Java 数组(或列表、集合...)?

Posted

技术标签:

【中文标题】JPQL IN 子句:Java 数组(或列表、集合...)?【英文标题】:JPQL IN clause: Java-Arrays (or Lists, Sets...)? 【发布时间】:2011-02-15 20:52:43 【问题描述】:

我想从我们的数据库中加载所有将文本标记设置为任何少量但任意数量的值的对象。在 SQL 中执行此操作的合乎逻辑的方法是构建一个“IN”子句。 JPQL 允许 IN,但它似乎要求我直接将每个参数指定为 IN(如“in (:in1, :in2, :in3)”)。

有什么方法可以指定一个数组或一个列表(或其他容器),它们应该展开为 IN 子句的值?

【问题讨论】:

【参考方案1】:

我不确定 JPA 1.0,但您可以在 JPA 2.0 中传递 Collection

String qlString = "select item from Item item where item.name IN :names"; 
Query q = em.createQuery(qlString, Item.class);

List<String> names = Arrays.asList("foo", "bar");

q.setParameter("names", names);
List<Item> actual = q.getResultList();

assertNotNull(actual);
assertEquals(2, actual.size());

使用 EclipseLInk 测试。在 Hibernate 3.5.1 中,您需要用括号将参数括起来:

String qlString = "select item from Item item where item.name IN (:names)";

但这是一个错误,上一个示例中的 JPQL 查询是有效的 JPQL。见HHH-5126。

【讨论】:

“in 子句”中使用的名称是否有最大数量? Hibernate 中的上述错误似乎已在 3.6.1 版本中修复 @pringlesinn IN 子句中值的数量取决于您的 DBMS 在 JPA 1.0 中工作(并且它没有强制用括号括起来,但为了便于阅读,你应该这样做) 如果你想要 => item.name in (like :names) 怎么办【参考方案2】:

oracle 限制为 1000 个参数。尽管通过将传递的参数列表拆分为 500 个为一组,但该问题已在 4.1.7 版本中由 hibernate 解决 see JIRA HHH-1123

【讨论】:

不幸的是,这没有解决。工单被标记为已解决,但问题(如 cmets 所示)并未由 Hibernate 团队解决。 @Druckles 嗯在哪里?我没有看到任何早于 2016 年的 cmets。而这只是两个 cmets,除了通常的互联网“help plz!!!11!!!!”之外几乎什么也没说。您没有理由相信错误报告已解决。 @searchengine27 我说报告已解决,尽管它被标记为已解决。正如 Steve Ebersole 所报告的那样,解决方案是:“解决方案是,当检测到这种情况时,我们将通过日志记录来警告用户。” Noel Trout 在 2012 年的 cmets 扩展了为什么这还不够。 换句话说,这个答案是错误的,或者充其量是误导。【参考方案3】:

我遇到了这种 sql 的问题,我在 IN 子句中给出了空列表(如果它不为空,请始终检查列表)。也许我的练习会对某人有所帮助。

【讨论】:

以上是关于JPQL IN 子句:Java 数组(或列表、集合...)?的主要内容,如果未能解决你的问题,请参考以下文章

使用子句 IN 从 sql 转换为 jpql

JPA JPQL IN 子句:如何在 JPA 中使用 IN 子句?

JPA JPQL IN子句:如何在JPA中使用IN子句?

JPQL查询where子句使用IN,如何将参数传递给查询

JPQL typedquery 中 IN 子句的解析

JPQL:如何使用 where 子句实现与集合成员声明相同的功能?