프레임워크(Framework)/JPA

[JPA] JPQL 서브 쿼리 - 객체지향 쿼리 언어 JPQL (5)

잇트루 2022. 12. 17. 01:18
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

서브 쿼리

JPQL도 SQL처럼 서브 쿼리를 지원한다. 단, 몇 가지 제약이 있다.

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

 

 

나이가 평균보다 많은 회원을 조회할 경우

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) : 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참

 

 

EXIST

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

팀 A 소속인 회원을 조회하는 경우

select m from Member m where exists (select t from m.team t where t.name = 'teamA')

 

 

{ALL | ANY | SOME}

  • ALL : 모두 만족하면 참
  • ANY, SOME : 조건을 하나라도 만족하면 참
  • 비교 연산자(=, >, ≥, <, ≤, <>)와 함께 사용한다.

전체 상품 각각의 재고보다 주문량이 많은 주문들을 조회하는 경우

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)

 

 

IN

  • 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참
  • IN은 서브쿼리가 아닌 곳에서도 사용한다.

20세 이상을 보유한 팀을 조회하는 경우

select t from Team t where t IN (select t2 From Team t2 JOIN t2.members m2 where m2.age >= 20)
반응형