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에서는 사용할 수 없다.
가능하면 조인으로 해결하거나 애플리케이션단에서 해결해야한다.