JPA

2월 14일 JPA JPQL 서브쿼리

Chaerin Yoo 2023. 2. 14. 15:35

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으로 해결을권장