В этой заметке расскажу вам о чудесном операторе, который есть в JPQL. В моей практике он использовался сильно реже чем оператор 'IN'. Возможно, что кто-то в этой заметке увидит его впервые и упростит себе код.
Представим, что у нас есть следующие сущности: 'Ученый', 'Конференция', 'Участие в конференции', 'Статья'. 'Участие в конференции' является связующей сущностью для связи ученого и конференции и хранит дополнительную информацию (например информацию об оплате взносов и даты заезда). У каждого ученого есть список статей в которых он является автором. Теперь перед нами стоит задача написать запрос, который бы вернул список всех участий в конференциях авторов определённой статьи.
Попробуем написать этот запрос на JPQL. Первое, что приходит в голову это использовать оператор 'IN'.
SELECT p FROM ConferenceParticipation p JOIN p.scientist s WHERE :article IN s.articles
Однако, данный оператор невозможно использовать в JPQL таким образом. Оператор 'IN' позволяет проверить атрибут сущности (или саму сущность) на вхождение в множество, переданное в запрос или также являющееся частью так называемого 'path experssion'. Из-за этого опреатором 'IN' невозможно проверить, что некоторая коллекция сущностей содержит переданный параметр.
Решением этой проблемы является оператор 'MEMBER OF'. Можно сказать, что данный оператор выполняет обратную операцию по отношению к оператору 'IN'. Правильное решение нашей задачи будет выглядеть следующим образом
SELECT p FROM ConferenceParticipation p JOIN p.scientist s WHERE :article MEMBER OF s.articles
Надеюсь что после прочтения этой заметки вы открыли незнакомый вам ранее оператор JPQL.
На этом, пожалуй, откланяюсь!