JVM/JPA

JPQL 서브쿼리

kyoulho 2023. 6. 26. 21:18

제약 사항

  • WHERE, HAVING 절에서만 사용할 수 있고 SELECT, FROM 절에서는 사용할 수 없다.
  • 하이버네이트의 HQL은 SELECT 절의 서브 쿼리도 허용한다. 하지만 FROM 절의 서브쿼리는 지원하지 않는다.
  • 일부 구현체는 FROM 절의 서브 쿼리도 지원한다.

 

서브 쿼리 함수

EXISTS

문법: [NOT] EXISTS (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.stockAmout 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)
728x90

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

JPQL 다형성 쿼리, 사용자 정의 함수, Named 쿼리  (0) 2023.06.28
JPQL 조건식  (0) 2023.06.28
JPQL 조인과 페치조인  (0) 2023.06.25
JPQL 기초  (0) 2023.06.25
값 타입 컬렉션 @ElementCollection @CollictionTable  (0) 2023.06.25