JPQL IN子句:Java-Arrays(或Lists,Sets ...)?

Ber*_*aug 101 sql orm jpa named-query jpql

我想将所有具有文本标记的对象加载到数据库中的任意一个小但任意数量的值中.在SQL中进行此操作的逻辑方法是构建"IN"子句.JPQL允许使用IN,但似乎需要我直接将每个参数指定给IN(例如,"in(:in1,:in2,:in3)").

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

Pas*_*ent 197

我不确定JPA 1.0,但你可以通过CollectionJPA 2.0:

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());
Run Code Online (Sandbox Code Playgroud)

使用EclipseLInk测试.使用Hibernate 3.5.1,您需要用括号括起参数:

String qlString = "select item from Item item where item.name IN (:names)";
Run Code Online (Sandbox Code Playgroud)

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

  • 是否有"in clause"中使用的最大名称数量? (5认同)
  • Hibernate中的上述错误似乎在版本3.6.1中得到修复 (3认同)