본문 바로가기
[JAVA]/JPA

JPQL - 서브 쿼리

by 팡펑퐁 2023. 5. 1.
728x90

서브쿼리

Example

  • 나이가 평균보다 많은 회원
SELECT m FROM Member m WHERE m.age > (SELECT avg(m2.age) FROM Member m2)
  • 한 건이라도 주문한 고객
SELECT m FROM Member m WHERE (SELECT count(o) FROM Order o WHERE m = o.member) > 0

 

 

서브 쿼리 지원 함수

[NOT] EXISTS (subquery)

  • 서브쿼리에 결과가 존재하면 참

{ALL | ANY | SOME} (subquery)

  • ALL : 모두 만족하면 참
  • ANY, SOME : 같은 의미, 조건을 하나라도 만족하면 참

[NOT] IN (subquery)

  • 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참

 

Example

  • 팀 A 소속인 회원
SELECT m FROM Member m
WHERE EXISTS (SELECT t FROM m.team t WHERE t.name = '팀A')
  • 전체 상품 각각의 재고보다 주문량이 많은 주문들
SELECT o FROM Order o
WHERE o.orderAmount > ALL (SELECT p.stockAmount FROM Product p)
  • 어떤 팀이든 팀에 소속된 회원
SELECT m FROM Member m
WHERE m.team = ANY (SELECT t FROM Team t)

 

JPA 서브 쿼리 한계

  • JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용이 가능하다.
  • SELECT 절도 가능하다.(하이버네이트에서 지원)
  • FROM 절의 서브 쿼리는 현재 JPQL에서는 불가능하다.
  • JOIN으로 풀 수 있으면 풀어서 해결

 

 

 

 

참고

김영한 - 자바 ORM 표준 JPA 프로그래밍

728x90

'[JAVA] > JPA' 카테고리의 다른 글

JPQL 조건식 - CASE 식  (0) 2023.05.03
JPQL - 타입 표현과 기타식  (0) 2023.05.01
JPQL - JOIN  (0) 2023.05.01
JPQL - 페이징 API  (0) 2023.05.01
JPQL - 프로젝션  (0) 2023.05.01