본문 바로가기
자바/JPA

[JPA/Java] JPQL 서브쿼리

by drCode 2023. 5. 9.
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
반응형

'자바 > JPA' 카테고리의 다른 글

[JPA/Java] JPQL CASE 문, COALESCE, NULLIF  (0) 2023.05.09
[JPA/Java] JPQL 타입 표현과 기타식  (0) 2023.05.09
[JPA/Java] JPQL 조인(Join)  (0) 2023.05.09
[JPA/Java] 페이징 API  (0) 2023.05.03
[JPA/Java] JPQL Projection(프로젝션)  (0) 2023.04.28

댓글