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


108

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

是否有某种方法可以指定应展开为IN子句值的数组或列表(或其他容器)?

Answers:


208

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

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


5
in子句中最多可以使用多少个名称?
Gondim

3
在Hibernate中上述缺陷似乎是固定在3.6.1版本
丹尼斯Kniazhev

1
@pringlesinn子句中值的数量取决于您的DBMS
TimBüthe16年

可以在JPA 1.0中使用(并且不带括号,但必须具有可读性,但应该具有可读性)
Javier Larios

如果您想在=> item.name中输入(例如:names)
dzgeek

3

oracle的限制是1000个参数。休眠状态已在4.1.7版中解决了该问题,但通过将传递的参数列表分成500组, 请参见JIRA HHH-1123


1
不幸的是,这没有解决。该票证被标记为已解决,但是Hibernate团队未解决问题(如注释所示)。
Druckles

@Druckles嗯?我看不到任何早于2016年的评论。而这些评论只是两条评论,几乎没有什么比平常的互联网“ help plz !!! 11 !!!!”多了。您没有理由相信已解决的错误报告。
searchengine27

@ searchengine27我说,报告没有解决,尽管它被标记为解决。正如Steve Ebersole所报告的那样,该解决方案是:“解决方案是,我们将仅在检测到这种情况时通过记录来警告用户。” 诺埃尔·特劳特(Noel Trout)早在2012年发表的评论就为何这还不够展开。
Druckles

换句话说,这个答案是错误的,或充其量是误导性的。
Druckles
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.