【发布时间】:2011-02-15 20:52:43
【问题描述】:
我想从我们的数据库中加载所有将文本标记设置为任何少量但任意数量的值的对象。在 SQL 中执行此操作的合乎逻辑的方法是构建一个“IN”子句。 JPQL 允许 IN,但它似乎要求我直接将每个参数指定为 IN(如“in (:in1, :in2, :in3)”)。
有什么方法可以指定一个数组或一个列表(或其他容器),它们应该展开为 IN 子句的值?
【问题讨论】:
标签: sql orm jpa jpql named-query
我想从我们的数据库中加载所有将文本标记设置为任何少量但任意数量的值的对象。在 SQL 中执行此操作的合乎逻辑的方法是构建一个“IN”子句。 JPQL 允许 IN,但它似乎要求我直接将每个参数指定为 IN(如“in (:in1, :in2, :in3)”)。
有什么方法可以指定一个数组或一个列表(或其他容器),它们应该展开为 IN 子句的值?
【问题讨论】:
标签: sql orm jpa jpql named-query
我不确定 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。
【讨论】:
oracle 限制为 1000 个参数。尽管通过将传递的参数列表拆分为 500 个为一组,但该问题已在 4.1.7 版本中由 hibernate 解决 see JIRA HHH-1123
【讨论】:
我遇到了这种 sql 的问题,我在 IN 子句中给出了空列表(如果它不为空,请始终检查列表)。也许我的练习会对某人有所帮助。
【讨论】: