ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서브 쿼리
    JPA/JPQL 2023. 7. 14. 00:21

    서브 쿼리의 예제들

     

    - 나이가 평균보다 많은 회원

    select m from Member m
    where m.age > (select avg(m2.age) from Member m2)

    (상위에서 정의한 Member m을 가져오지 않고 m2를 새로 만들어야지 서브 쿼리 성능이 잘 나옴)

     

    - 한 건이라도 주문한 고객

    select m from Member m
    where (select count(o) from Order o where m = o.member) > 0

    (서브 쿼리를 할 때 위에서 사용한 m을 아래 서브 쿼리로 끌고오면 성능이 잘 안 나옴)

     

     

    서브 쿼리 지원 함수

     

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

    • {ALL | ANY | SOME} (subquery)
    • ALL 모두 만족하면 참
    • ANY, SOME: 같은 의미, 조건을 하나라도 만족하면 참

     

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

     

     

    서브 쿼리 지원 함수 예제

     

    - 팀A 소속인 회원 (exists의 예제)

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


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

    select o from Order o 
    where o.orderAmount > ALL (select p.stockAmount from Product p)


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

    select m from Member m 
    where m.team = ANY (select t from Team t)

     

     

    JPA 서브 쿼리 한계

     

    일반적인 SQL과 차이가 거의 없지만 약간의 한계점이 있다.

    • JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능
    • SELECT 절도 가능(하이버네이트에서 지원)
    • FROM 절의 서브 쿼리는 현재 JPQL에서 불가능

     

    FROM절에서 해결하기 위해서는

     

    1. 조인으로 풀 수 있으면 풀어서 해결

    2. 쿼리를 2번 날리기

    3. native SQL 사용해서 해결

     

    'JPA > JPQL' 카테고리의 다른 글

    경로 표현식  (0) 2023.08.09
    조건식 (CASE)  (0) 2023.07.14
    페이징, 조인  (0) 2023.07.14
    프로젝션(SELECT)  (0) 2023.07.13
    JPA에서의 쿼리 언어들  (0) 2023.07.13
Designed by Tistory.