BE전문가 프로젝트

서브쿼리 본문

JPA

서브쿼리

원호보고서 2022. 11. 7. 22:08
  • 나이가 평균보다 많은 회원
select m from Member m
where m.age > (select avg(m2.age) from Member m2)
  • 한 건이라도 주문한 고객
select m from Member mm
where (select count(o) from Order o where m = o.member) > 0

일반적인 sql에서 지원하는 서브쿼리가 가능

 

서브 쿼리 지원 함수

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

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

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

 

서브 쿼리 예제

  • 팀A 소속인 회원
select m from Member mm
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으로 풀 수 있으면 풀어서 해결)

정말 해결이 되지 않는다면 NativeSQL을 사용해야 하거나 분해해서 사용해야 한다.

 

'JPA' 카테고리의 다른 글

조건식(Case 식 등)  (0) 2022.11.07
JPQL 타입 표현  (0) 2022.11.07
Join  (0) 2022.11.06
페이징 API  (0) 2022.11.06
프로젝션  (0) 2022.11.06
Comments