본문 바로가기

스터디/JPA

객체지향 쿼리 언어 - (5)

728x90
반응형

JPQL - (4)


경로 표현식

경로 표현식.을 찍어 객체 그래프를 탐색하는 것이다

 

용어 정리

 

상태 필드: 단순히 값을 저장하기 위한 필드

연관 필드: 연관관계를 위한 필드, 임베디드 타입 포함

 

단일 값 연관 필드: 다대일, 일대일, 대상이 엔티티

컬렉션 값 연관 필드: 일대다, 다대다, 대상이 컬렉션

 

 

경로 표현식과 특징

 

- 상태 필드 경로

 

경로 탐색의 끝, 더는 탐색할 수 없다

select m.username, m.age from Member m

 

- 단일 값 연관 경로

 

묵시적으로 내부 조인이 일어난다

외부 조인은 명시적으로 join 키워드를 사용해야 한다

 

계속해서 탐색할 수 있다

select o.member from Order o

 

select o.member.team
from Order o
where o.product.name = 'productA' and o.address.city = 'JINJU'

order가 member, team, product와 조인이 발생한다 → 총 3번

 

- 컬렉션 값 연관 경로

 

묵시적으로 내부 조인이 일어난다

 

더는 탐색할 수 없다

from 절에서 조인을 통해 별칭을 얻으면 별칭으로 탐색할 수 있다

select t.members from Team t

select t.members.username from Team t //실패
select m.username from Team t join t.members m 

 

컬렉션의 크기를 구할 수 있는 size라는 특별한 기능을 사용할 수 있다

select t.members.size form Team t

 

 

경로 탐색을 사용한 묵시적 조인 시 주의사항

 

조인이 성능상 차지하는 부분은 아주 큰데, 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵다는 단점이 있다

성능이 중요한 경우 분석하기 쉽도록 명시적 조인을 사용하자

서브 쿼리

JPQL에서는 서브 쿼리를 where, having 절에서만 사용할 수 있고 select from 절에서는 사용할 수 없다

 

예시)

select m from Member m
where m.age > (select avg(m2.age) from Member m2)

나이가 평균보다 많은 회원을 찾는다

 

select m from Member m
where (select count(o) form Order o where m = o.member) > 0

select m from Member m
where m.orders.size > 0

한 건 이상 주문한 고객을 찾는다

 

 

서브 쿼리 함수

 

- [not] exists (서브 쿼리)

서브 쿼리에 결과가 존재하면 참이다

 

- {all | any | some} (서브 쿼리)

비교 연산자와 함께 사용한다

all은 모든 조건을 만족하면 참이다

any, some은 조건을 하나라도 만족하면 참이다

 

- [not] in (서브 쿼리)

서브 쿼리의 결과 중 하나라도 같은 것이 있으면 참이다

서브 쿼리가 아닌 곳에서도 사용한다

728x90
반응형

'스터디 > JPA' 카테고리의 다른 글

객체지향 쿼리 언어 - (7)  (1) 2025.02.19
객체지향 쿼리 언어 - (6)  (0) 2025.02.19
객체지향 쿼리 언어 - (4)  (0) 2025.02.18
객체지향 쿼리 언어 - (3)  (0) 2025.02.17
객체지향 쿼리 언어 - (2)  (0) 2025.02.17