Предложение JPQL IN: Java-массивы (или списки, наборы...)?
Я хотел бы загрузить из нашей базы данных все объекты, для которых установлен текстовый тег с любым небольшим, но произвольным числом значений. Логическим способом решения этой проблемы в SQL было бы создание предложения "IN". JPQL допускает IN, но, похоже, требует, чтобы я указывал каждый отдельный параметр для IN напрямую (как в "in (:in1,:in2,:in3)").
Есть ли какой-нибудь способ указать массив или список (или какой-либо другой контейнер), который должен быть развернут до значений предложения IN?
2 ответа
Я не уверен в 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.
Предел оракула составляет 1000 параметров. Эта проблема была решена с помощью hibernate в версии 4.1.7, хотя путем разделения списка переданных параметров на наборы по 500 см. JIRA HHH-1123
У меня была проблема с таким sql, я давал пустой список в предложении IN (всегда проверяйте список, если он не пуст). Может моя практика кому-то поможет.