JPQL 경로 표현식
경로 표현식은 (.)점을 찍어 객체 그래프를 탐색하는 것을 말한다.
select m.username -> (상태필드 from 에 엔티티의 컬럼)
from Member m
join m.team t (단일 값 연관필드) 엔티티 다대일
join m.orers o (컬렉션 값 , 연관 필드) 엔티티 일대 다
where t.name = '팀A'
경로 표현식 용어정리
상태필드(state field)
단순히 값을 저장하기 위한 필드 (ex m.username)
연관필드(association field)
(join하는 from절의 엔티티의 연관관계 필드)연관 필드를 위한 필드
1.단일 값 연관필드
@ManyToOne , @OneToOne , 조인하는 대상이 엔티티인 경우 (ex : m.team)
2.컬렉션 값 연관 필드
@OneToMany , @ManyToMany , 조인하는 대상이 컬렉션인 경우 (ex : m.orders)
경로 표현식 특징
상태필드(state field) : 경로 탐색의 끝 .탐색 x (더 깊이 못감)
단일 값 연관경로 : 묵시적 내부조인(inner join) 발생 , 탐색ㅇ(더 깊이 탐색가능)
컬렉션 값 연관경로 : 묵시적 내부조인(inner join)발생 , 탐색 X(더 깊이 담색 불가능) (컬렉션의 특정 요소만을 지정해서 탐색이 불가능하기 때문)
from 절에서 명시적 조인을 통해 별칭을 얻으며 별칭을 통해 탐색 가능
묵시적 내부 조인 발생 (조심해서 사용해야 한다)
컬렉션 값 연관경로의 경우 어던 엔티티에서 뭘 선택해야 할지 불문명 하다 ,
리턴값이 collection size 정도는 사용이 가능하다.
컬렉션값 연관 결로에서 탐색을 하고 싶다면
(컬렉션값 연관경로) 묵시적 조인
select t.members.size() from Team t
(탐색을 원할 경우) 명시적 조인으로 별칭을 얻어온다.
select m.username from Team t join t.members m
실무에서는 그냥 묵시적 조인을 쓰지않고 명시적 조인을 사용하자.
상태필드 경로탐색
JPQL : select m.username , m.age from Member m
SQL : select m.username , m.age .from Member m
단일 값 연관경로 탐색
JPQL : select o.member from Order o
SQL : select m.*
from Orders o
inner join Member m on o.member_id = m.id
묵시적 조인 발생
상당히 위험
묵시적 조인과 명시적 조인
명시적 조인 : join 키워드 직접 사용
select m from Member m join m.team t
묵시적 조인 : 결로 표현식에 의해 묵싲거으로 SQL 조인 발생(innerJoin) 내부 조인만 가능
select m.team from Member m
//m.team을 찾기위해 표시되지 않은 join을 실행한다.
경로표현식 예제
select o.member.team from Order o //성공
select t.members from Team t // 성공
select t.members.username from Team t // 실패 경로가 2번나와 실패
select m.username from Team t join t.members m // 성공 명시적 조인 사용
경로탐색을 사용한 묵시적 조인시 주의사항
-항상 내부 조인
-컬렉션은 경로탐색의 끝 , 명시적조인을 통해 별칭을 얻어야 한다.
-경로탐색은 주로 select , where 절에서 사용하지만 묵시적 조인으로 인해 SQL 의 from(join) 절에 영향을줌
실무 조언
-가급적 묵시적 조인대상에 명시적 조인을 사용
-조인은 SQL 튜닝에 중요포인트
-묵시적 조인은 조인이 일어나는 상황을 하눈에 파악하기 어려움
결론 명시적 조인만 사용할것
'JPA' 카테고리의 다른 글
| 2월 16일 JPA 일대다 관계, 컬렉션 페치 조인 (0) | 2023.02.16 |
|---|---|
| 2월 16일 JPA JPQL fetch Join (0) | 2023.02.16 |
| 2월 15일 JPA JPQL기본 함수 (0) | 2023.02.15 |
| 2월 15일 JPA JPQL 조건식CASE 식 (0) | 2023.02.15 |
| 2월 14일 JPA JPQL 타입표현 (0) | 2023.02.14 |