JPA/JPA 기본

42. 서브쿼리

sdafdq 2023. 10. 31. 10:23

sql에서 처럼 쿼리 안의 쿼리 라는 느낌

 

List<Member> result = em.createQuery("select m from Member m where exists(select t from m.team t where t.name = 'teamA')", Member.class)
        .getResultList();

member를 가져오는데, exists, 즉 존재하는 경우만.

멤버의 팀의 이름이 teamA인 경우에만 가져옴. (where)

 

select o from Order o where o.orderAmount > all(select p.stockAmount from Product p)

주문을 가져오는데, 주문량이 상품(Product)의 재고보다 클 경우만

 

select m from Member m where m.team = any(select t from Team t)

Member를 가져오는데, 멤버의 팀이 어떤 팀이든 있는 경우

 

 

in도 쓸 수 있음.

 

 

 

JPA 서브쿼리의 한계

JPA는 서브쿼리를 WHERE, HAVING에서만 사용 가능(JPA 표준이 그렇고, 하이버네이트에서는 됨.)

 

from 절의 서브쿼리는 현재 JPQL에서는 불가능.

JOIN으로 가능하면 JOIN으로 하셈.

 

select mm.username, mm.age from (select m.username ,m.age from Member m) mm

이런 게 안됨.

 

 

그래서 뭐 해결 방법은

JOIN으로 해결하거나

쿼리를 두번 날리거나.

네이티브 쿼리를 하거나

 

조회해서 오는 거는 최대한 범위 좁혀서 가져와야 하는 듯.

정확한 범위로.

 

아니면 그냥 비즈니스 로직으로 풀어도 되고..

 

 

'JPA > JPA 기본' 카테고리의 다른 글

44. 조건식. case 등등  (0) 2023.10.31
43. JPA 타입 표현과 기타식  (0) 2023.10.31
41. 조인  (0) 2023.10.31
40. 페이징  (0) 2023.10.31
39. 프로젝션(select)  (0) 2023.10.30