2월 14일 JPA JPQL 서브쿼리
JPQL에서 서브쿼리 사용
나이가 평균보다 많은 회원
select m from Member m
where m.age > (select avg(m2.age) from Member m2);
한건이라도 주문한 고객
select m from Member m
where(select count(0) from Order o where m = o.member) > 0
서브쿼리 지원 함수
[NOT] EXISTS(subquery) : 서브쿼리에 결과가 존재하면됨
{ALL | ANY | SOME} (subquery)
-All : 모두 만족하면 된다. (and)
-Any, Some : 같은 의미 , 조건을 하나라도 만족하면 된다.(or)
[NOT]IN(subquery) : 서브쿼리의 결과중 하나라도 IN절과 같은 값이 있으면 참
ex
1.팀A 소속인 회원
select m from MEmber m
where exists(select t from m.team t where t.name = "팀A")
서브쿼리 결과 내에 값이 있으면 true , where 가 true시 쿼리 실행
2.전체 상품 각각의 재고보다 주문량이 많은 상품들
select o from Order o
where o.orderAmount > All(select p.stockAmount from Product p)
서브쿼리의 결과가 조건에 요구를 만족하면 true
3.어떤 팀이든 팀에 소속된 회원
select m from Member m
where m.team = ANY(select t from Team t)
서브쿼리의 결과가 하나라도 m.team에 만족하면 true
JPA에서 서브쿼리의 관계
-JPA는 where , Having 절에서만 서브쿼리를 사용가능
-하이버네이트를 사용하면 select에서도 서브쿼리 사용가능
-From절에 서브쿼리는 현재 JPQL에서 불가능
-Join으로 풀수 있으면 풀어서 해결하는게 좋음 > 이유는 DB테이블이 아니라 엔티티가 와야하기 때문
가급적 JOIN으로 해결을권장