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 에서 불가능하다.
최대한 조인으로 풀 수 있으면 풀어서 해결해야한다.
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 |
댓글