Стаття JPQL IN: Java-масиви (або списки, набори ...)?


108

Я хотів би завантажити всі об’єкти, у яких текстовий тег встановлений на будь-яку невелику, але довільну кількість значень з нашої бази даних. Логічним способом зробити це в SQL було б побудувати пункт "IN". JPQL дозволяє використовувати IN, але, здається, вимагає від мене безпосередньо вказати кожен параметр IN (як в, "in (: in1,: in2,: in3)").

Чи є спосіб вказати масив чи список (чи якийсь інший контейнер), який слід розкрутити до значень пункту IN?

Відповіді:


208

Я не впевнений у 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());

Тестували за допомогою EclipseLInk. У режимі Hibernate 3.5.1 вам потрібно буде оточити параметр круглими дужками:

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

Але це помилка, JPQL-запит у попередньому зразку є дійсним JPQL. Див. HHH-5126 .


5
чи існує максимальна кількість імен, які слід використовувати у "в пункті"?
Гондім

3
Згадану помилку в режимі глибокого сну, здається, виправлено у версії 3.6.1
Денис Княжев

1
@pringlesinn кількість значень у пункті IN залежить від вашої СУБД
Tim Büthe

працює в JPA 1.0 (і не обов'язкове оточення з дужками, але для читабельності вам слід)
Хав'єр Ларіос

що робити, якщо ти хочеш => item.name у (наприклад: імена)
dzgeek

3

Межа оракула - 1000 параметрів. Проблема була вирішена в сплячому режимі у версії 4.1.7, хоча шляхом розділення списку пройдених параметрів на набори 500 див. JIRA HHH-1123


1
На жаль, це не було вирішено. Квиток було позначено як вирішене, але проблема (як показано в коментарях) не була виправлена ​​командою зі сну.
Друклес

@Druckles гм де? Я не бачу жодних коментарів, старших за 2016 рік. І це були лише два коментарі, в яких сказано практично нічого, крім звичайного Інтернету "help plz !!! 11 !!!!". Ви не давали причин довіряти звіту про помилку як вирішеному.
searchchengine27

@ searchchengine27 Я сказав, що звіт не вирішено, незважаючи на те, що він позначений як вирішений. Як повідомив Стів Еберсол, резолюція: "Рішення в цьому полягає в тому, що ми просто збираємось попереджати користувачів за допомогою реєстрації, коли ця умова виявлена". Зауваження Ноеля Форель ще в 2012 році розширюються, чому цього недостатньо.
Друклес

Іншими словами, ця відповідь є неправильною або, у кращому випадку, оманливою.
Друкель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.