JPA соответствует подмножеству элементов в отношении ManyToMany - PullRequest
0 голосов
/ 26 июня 2018

В моей базе данных есть две таблицы: Персона и Язык. Эти две таблицы отображаются в Hibernate в отношениях «многие ко многим», причем каждый человек говорит на нескольких языках.

Теперь я хочу написать метод, который принимает список языков и возвращает список людей, говорящих на ВСЕХ (логических AND) этих языков. Я пытался построить критерии, такие как:

Restrictions.in("languages", languagesList);

но в результате появился список людей, говорящих на ЛЮБОМ (логическом ИЛИ) из этих языков.

Я посмотрел онлайн и обнаружил, что есть некоторые приемы, использующие соединения и НЕ СУЩЕСТВУЮТ, но они больше походили на хаки, поэтому я хотел проверить, есть ли более чистый подход для достижения этого.

Есть предложения? Благодаря.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Попробуйте запрос JPQL, который сначала выбирает всех людей, которые говорят на одном языке, а затем выбирает из этого списка всех людей, которые также говорят на другом языке.

List<Person> ps = em.createQuery("select distinct p from Person p join p.languages l where l.languageName = 'english' "
+ " and p.id in (select distinct p.id from Person p join p.languages l where l.languageName = 'spanish' )", Person.class).getResultList();

Должно работать.

0 голосов
/ 26 июня 2018

Ваша проблема с пониманием базовой реляционной модели, а не с Hibernate. Конструктор Restrictions.in сопоставляется с оператором SQL IN, поэтому ваш результат не является неожиданным.

В SQL эта проблема тоже интересна. Возможный подход - это ( полный источник SQL ):

select u.user_name, count(l.language_name)
  from user u
  join user_language ul on u.user_name = ul.user_name
  join language l on l.language_name = ul.language_name
 where l.language_name in ('spanish', 'italian')
 group by u.user_name
 having count(l.language_name) = 2

Параметры запроса:

  • массив языков ('spanish', 'italian')
  • длина массива (2)

К сожалению, сейчас у меня под рукой нет Hibernate, но я думаю, вам лучше использовать HQL, а не Criteria API для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...