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

我想加载所有对象的文本标签设置为从我们的数据库中的任何一个小但任意数量的值。 在SQL中进行这种逻辑的方法是构build一个“IN”子句。 JPQL允许IN,但似乎要求我直接指定IN的每个参数(如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进行testing。 使用Hibernate 3.5.1,您需要用括号括住参数:

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

但是这是一个错误,前一个示例中的JPQL查询是有效的JPQL。 见HHH-5126 。

oracle限制是1000个参数。 这个问题已经通过版本4.1.7中的hibernate解决了,但是通过将传递的参数列表分成500个集合, 参见JIRA HHH-1123

Interesting Posts