JPQLIN 子句: Java 数组(还是列表、集... ...) ?

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

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

182545 次浏览

我不确定 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());

在 Hibernate 3.5.1中,你需要在参数旁边加上括号:

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

但这是一个 bug,前面示例中的 JPQL 查询是有效的 JPQL。

Oracle 的限制是1000个参数。在4.1.7版本中,这个问题已经通过休眠解决了,尽管是通过将传递的参数列表拆分为500个集合 参见 JIRA HHH-1123

我在使用这种 sql 时遇到了一个问题,我在 IN 子句中给出了空列表(如果列表不是空的,总是检查它)。也许我的诊所能帮到别人。