스프링 공부/JPA

[JPA] 25. Re.Zero : JPQL : 서브쿼리

장아장 2023. 1. 19. 19:35

 

 

서브쿼리

쿼리안에서 사용되는 서브쿼리를 만들어 쓸 수 있다. 

(괜히 연산 하나 한 값을 가져와서 이걸 대입해서 뭐 어떻게 하려는거보단, 편할테니까???)

 

예를들면, Member의 age가 18살 이상인 사람들이 속한 팀들을 조회해오는 방식으로 처리될 수 있다. 

 

서브쿼리에서 지원되는 함수는 

Exists (서브쿼리) : 서브쿼리의 결과가 존재하면 참

All (서브쿼리) : 모두 만족하면 참 

Any (서브쿼리) : 조건을 하나라도 만족하면 참

Some : Any와 동일

In (서브쿼리) : 서브쿼리의 결과중 하나라도 같은게 존재하면 참

 

Exists, In은 앞에 not을 붙여 사용할 수 있다. 

 

team1이라는 엔티티를 조회한다. 이게 멤버에게 존재한다면 참을 반환한다. 

즉, team1이라는 인스턴스를 가지고 있는 멤버 객체만이 나오게 된다. 

(쉽게 말하면 그냥 team1인 멤버를 찾아오라는 쿼리지만, 컴퓨터에게 모든 과정을 하나하나 설명해주어야 한다….)

 

 

전체 상품의 주문 수량을 해당 제품의 재고를 보았을 때, 재고보다 주문량이 더 많을 경우 반환하는 쿼리문이다. 

 

팀을 전부 가져온다. 멤버의 인스턴스중에 이 팀중에 하나라도 존재한다면 참을 반환하게 된다.

그래서 그 멤버가 반환된다. 

한줄 요약 : 팀이 있기라도 한 멤버는 모두 가져온다. 

 

JPA는 where, having절에서만 서브쿼리를 사용할 수 있다. 

하이버네이트 기준으로는 select문 자체에서도 사용할 수 있지만, 

From 절의 서브쿼리는 join으로 풀어서 해결해야 한다.