Как сделать JPQ SubQuery?

Можно ли выполнить эквивалент этого sql-запроса в JPQL?

SELECT * 
 FROM COUNTRIES c WHERE COUNTRY_ID IN (
  SELECT DISTINCT COUNTRY_ID 
   FROM PORTS p 
   WHERE p.COUNTRY_ID = c.COUNTRY_ID AND STATE = 'A'
) 

Ответ 1

Вам нужно протестировать его с помощью IN и подзапрос, поскольку оба они работают в JPQL (согласно синтаксической ссылке они работают вместе). Вы также можете посмотреть MEMBER OF expression.

Но, на мой взгляд, есть лучший подход. Такие запросы называются коррелированными подзапросами, и их всегда можно переписать с помощью EXISTS:

SELECT * FROM COUNTRIES c WHERE 
EXISTS (
        SELECT 'found' FROM PORTS p 
        WHERE p.COUNTRY_ID = c.COUNTRY_ID AND STATE = 'A'
) 

JPQL поддерживает EXISTS с подзапросами.