Параметр JPQL IN: Java-массивы (или списки, наборы...)?
Я хотел бы загрузить все объекты с текстовым тегом, установленным на любое из небольшого, но произвольного количества значений из нашей базы данных. Логичным способом сделать это в SQL было бы создание предложения "IN". JPQL допускает IN, но мне кажется, что я должен указывать каждый отдельный параметр на IN напрямую (как в, "in (: in1,: in2,: in3)" ).
Есть ли способ указать массив или список (или какой-либо другой контейнер), который должен быть развернут для значений предложения IN?
Ответы
Ответ 1
Я не уверен в JPA 1.0, но вы можете передать Collection
в JPA 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());
Протестировано с помощью EclipseLInk. С Hibernate 3.5.1 вам необходимо окружить параметр скобкой:
String qlString = "select item from Item item where item.name IN (:names)";
Но это ошибка, запрос JPQL в предыдущем примере является допустимым JPQL. См. HHH-5126.
Ответ 2
Предел оракула - 1000 параметров. Проблема была разрешена спящим режимом в версии 4.1.7, хотя, разделив переданный список параметров в наборах 500
см. JIRA HHH-1123