자바/JPA

[JPA/Java] JPQL 서브쿼리

drCode 2023. 5. 9. 10:33
728x90
반응형

JPQL 에서도 서브쿼리를 사용할 수 있다.

 

JPQL 서브쿼리 예시를 보면

 

예시) 나이가 평균보다 많은 회원

String jpql = "SELECT m FROM Member m WHERE m.age > (SELECT avg(m2.age) FROM Member m2)"

 

 

예시) 한 건이라도 주문한 고객

String jpql = "SELECT m FROM Member m WHERE (SELECT count(o) FROM Order o WHERE m = o.member) > 0"

 

서브 쿼리에서 지원되는 함수가 몇 있다.

1) [NOT] EXISTS (subquery) : 서브쿼리에 결과가 존재하면 참

   -  {ALL | ANY | SOME} (subquery)

   -  모두 만족하면 참

   -  ANY, SOME : 같은 의미, 조건을 하나라도 만족하면 참

 2) [NOT] IN (subquery) : 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참

 

JPQL 서브 쿼리 예제

 - 팀 A 소속인 회원 (EXISTS)

String jpql = "select m from Member m where exists (select t from m.team t where t.name = ‘팀A')";

 

 - 전체 상품 각각의 재고보다 주문량이 많은 주문들 ( ALL)

String jpql = "select m from Member m where exists (select t from m.team t where t.name = ‘팀A')";

 

 - 어떤 팀이든 팀에 소속된 회원 ( ANY)

String jpql = "select m from Member m where m.team = ANY (select t from Team t)";

 

JPA 는 서브쿼리의 한계가 있는데

 

WHERE 절이나, HAVING 절에서만 서브 쿼리 사용이 가능하다

 

SELECT 절도 가능하다. 다만, 하이버네이트에서 지원한다

 

FROM 절의 서브쿼리는 현재 JPQL 에서 불가능하다.

 

최대한 조인으로 풀 수 있으면 풀어서 해결해야한다.

 

JPQL FROM 절에서는 서브쿼리 지원 안됌

728x90
반응형