JPA JPQL에서도 마찬가지로 서브쿼리를 사용할 수 있다.


비연관 서브 쿼리

select m from Member m where m.age > (select avg(mm.age) from Member mm)

메인 쿼리에서 Member를 사용하고 서브쿼리에서 다시 Member를 사용하고 있지만, 두 Member는 쿼리상에서는 연관이 있지않다. 이런 방식으로 서브쿼리를 사용할 수 있다.

연관 서브 쿼리

select m from Member m where (select count(o) from Orders o where m = o.member) > 0

메인 쿼리의 Member와 Orders가 서로 연관되어 작동한다. 이렇게 연관 서브쿼리도 가능하다.

서브 쿼리 지원 함수

FUNCTION DESCRIPTION
[NOT] EXISTS 서브 쿼리에 결과가 존재하면 참[거짓]
ALL 모두 만족할 경우 참
ANY 조건을 하나라도 만족하게 되면 참
SOME 조건을 하나라도 만족하게 되면 참
[NOT] IN 서브 쿼리에 결과에 하나라도 같은 것이 있으면 참

서브 쿼리 지원 함수 예제

select m from Member m where exists (select t from m.team t where t.name = 'teamA')
select o from Order o where o.amount > ALL (select p.stock from Product p)
select m from Member m where m.team = ANY (select t from Team t)

JPA JPQL 서브 쿼리의 한계

현재 JPA에서는 SELECT, WHERE, HAVING 절에서만 서브 쿼리를 사용할 수 있다.

FROM 절의 서브 쿼리(인라인 뷰, 동적 뷰)는 현재 JPQL에서는 사용할 수 없다.

가능하면 조인으로 해결하거나 애플리케이션단에서 해결해야한다.