JPQL - 서브 쿼리

2023. 10. 23. 15:03JPA

반응형

JPQL도 SQL 처럼 서브 쿼리를 지원한다. 여기에는 몇가지 제약이 있는데, 서브쿼리를 WHERE, HAVING 절에서만 사용할 수 있고, SELECT, FROM 절에서는 사용할 수 없다.

다음은 나이가 평균보다 많은 회원을 찾는다.

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

# 참고로 이 쿼리는 다음처럼 컬렉션 값 연관 필드의 size 기능을 사용해도 같은 결과를 얻을 수 있다.
select m from Member m 
where m.orders.size > 0

 

서브 쿼리 함수

서브 쿼리는 다음 함수들과 같이 사용할 수 있다.

  • [NOT] EXIST (subquery)
  • (ALL | ANY | SOME) (subquery)
  • [NOT] IN (subquery)

▼ EXISTS
문법: [NOT] EXIST (subquery)
설명: 서브쿼리에 결과가 존재하면 참이다. NOT은 반대
: 팀A 소속인 회원

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

 

▼ {ALL | ANY | SOME}
문법: {ALL | ANY | SOME} (subquery)
설명: 비교 연산자와 같이 사용한다.
-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
문법: [NOT] IN (subquery)
설명: 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참이다. 참고로 IN은 서브쿼리가 아닌 곳에서도 사용된다.
: 20세 이상인 팀원을 보유한 팀

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

'JPA' 카테고리의 다른 글

JPQL - Named 쿼리 - 정적 쿼리  (0) 2024.05.14
JPQL - CASE 식  (0) 2024.03.25
JPQL - 경로 표현식  (4) 2023.10.23
JPQL - 페치 조인(Fetch Join)  (0) 2023.10.12
JPQL 조인  (2) 2023.10.10