124

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

有没有办法指定一个数组,或者一个列表(或其他容器)应该展开为 IN 子句的值?

4

3 回答 3

229

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

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

于 2010-05-08T10:25:06.663 回答
3

oracle 限制为 1000 个参数。该问题已在版本 4.1.7 中由休眠解决,尽管通过将传递的参数列表拆分为 500 个集合, 请参阅 JIRA HHH-1123

于 2013-06-27T18:09:21.900 回答
1

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

于 2020-11-13T12:42:50.833 回答