본문 바로가기

JPA

2월 15일 JPA JPQL 경로 표현식

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 튜닝에 중요포인트

-묵시적 조인은 조인이 일어나는 상황을 하눈에 파악하기 어려움

 

결론 명시적 조인만 사용할것