我想从我们的数据库中加载所有具有文本标签设置为任意少量但任意值的对象。在SQL中处理这个问题的逻辑方法是构建一个“IN”子句。JPQL允许使用IN,但似乎需要直接指定每个参数(例如,“in(:in1,:in2,:in3)”)。
是否有一种方式可以指定一个数组、列表(或其他容器),以便展开成一个IN子句的值?
我想从我们的数据库中加载所有具有文本标签设置为任意少量但任意值的对象。在SQL中处理这个问题的逻辑方法是构建一个“IN”子句。JPQL允许使用IN,但似乎需要直接指定每个参数(例如,“in(:in1,:in2,:in3)”)。
是否有一种方式可以指定一个数组、列表(或其他容器),以便展开成一个IN子句的值?
我不确定在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。
我在使用这种sql时遇到了问题,我在IN子句中传递了一个空列表(始终检查列表是否为空)。也许我的做法会帮助到其他人。
Oracle数据库只能支持1000个参数。通过将传递的参数列表分成500个一组,Hibernate在版本4.1.7中已经解决了这个问题。 详见JIRA HHH-1123
java.sql.SQLSyntaxErrorException: ORA-00936: missing expression
),请勿将“in (<args...>)”子句与空的<args...>列表一起使用,因为这是无效的。 - Pfiver