2014-12-30 2 views
0

Я хочу найти список сущностей, присутствующих в первом списке, и отклонить объекты, если они существуют во втором списке.
Примеры данных:
У меня есть продукты: P1, P2 и P3. Другой (основной) объект - это элементы: I1 и I2. Объект I1 содержит P1, а P2 и I2 содержит P2 и P3. Я хочу найти список элементов, если они присутствуют в List1 (содержит только P1) и отклоняет каждый элемент, если он присутствует в List2 (содержит только P3). Поэтому он должен дать мне I1 в качестве вывода.
Мой запрос и код:JPQL Query - объект, который находится в одном списке и не находится в другом

Query query = this.em.createQuery("SELECT distinct(i) FROM Item i join fetch i.products ip WHERE ip.product IN :list1 AND ip.product NOT IN :list2"); 
    query.setParameter("list1", list1); 
    query.setParameter("list2", list2); 

Этот запрос дает мне список обеих позиций. Что здесь не так?

+1

Вы задаете значение параметра 'list1' дважды в коде, это опечатка или реальный код? –

+0

Это опечатка, немедленно исправить ошибку –

+0

«Я» действительно имя столбца, которое вы хотите отобразить из таблицы элементов? Это похоже на псевдоним таблицы. возможно, вы имеете в виду 'different *' или 'different i.id?' Я думаю, что это, скорее всего, вызовет синтаксическую ошибку. Вы заблуждаетесь? если да, то какая ошибка вы получаете или это просто возвращает пустой набор? Наконец, я не уверен, но похоже, что «внешнее соединение» будет работать лучше здесь или даже утверждение 'exist'. – xQbert

ответ

1

Попробуйте

SELECT distinct i FROM Item i join fetch i.products ip WHERE :list1 IN ip and :list2 NOT IN ip 

UPDATE

Я пытался получить эту работу сам, но без каких-либо результатов. @NeilStockton предположил, что он не поддерживается в спецификации JPA.

Однако в вашем примере у вас есть списки параметров с одним элементом. В случае параметров одного элемента это должно работать:

Query query = this.em.createQuery("SELECT distinct i FROM Item i join fetch i.products ip WHERE :param1 IN elements(ip) and :param2 NOT IN elements(ip)"); 

query.setParameter("param1", product1); 
query.setParameter("param2", product2); 
+0

Идея отмечает ошибку в ip после: list1 и говорит: ''(' или <входной параметр> ожидается, получил ip' –

+0

Список не может быть в списке, согласно спецификации JPA. –

+0

@NeilStockton Не проверял спецификацию (у вас есть ссылка?), но тестирование различных комбинаций не дало результата. Я обновлю свой ответ. –

Смежные вопросы