angle-left

Оператор обратный 'IN' в JPQL

В этой заметке расскажу вам о чудесном операторе, который есть в 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.

 

На этом, пожалуй, откланяюсь!