경로 표현식
상태필드
상태필드는 단순히 값을 저장하기 위한 필드로 엔티티의 내부 멤버 변수라고 생각하면 된다.
ex) m.username
연관 필드
연관 필드는 연관관계를 위한 필드이다.
- 단일 값 연관 필드
만일 Member 엔티티에 ManyToOne으로 연관된 Team 엔티티가 있다고 하면 이때 m.team은 단일값 연관 필드가 된다. 단일 값 연관 경로는 묵시적 내부 조인이 발생한다. 단순히 말해서 자동으로 TEAM 테이블의 내용이 MEMBER 테이블을 조회할 때 자동으로 조인된다.
String query = "select m.team From Member m";
List<Team> result
= em.createQuery(query, Team.class).getResultList();
쿼리 출력>>>
/* select
m.team
From
Member m */ select
team1_.id as id1_3_,
team1_.name as name2_3_
from
Member member0_
inner join // <-- 자동적으로 inner join이 발생함(묵시적 내부 조인)
Team team1_
on member0_.TEAM_ID=team1_.id
- 컬렉션 값 연관 필드
Team 엔티티에 OneToMany로 연관된 List<Member> members 엔티티 컬렉션이 있다고 하면 t.members는 컬렉션 값 연관 필드이다. 컬렉션 값 연관필드 또한 묵시적 내부 조인이 발생한다. 다만 이 경우는 그냥을 탐색을 하지 못한다는 문제가 있다. 탐색을 못한다는게 무슨 말이냐면 예를 들어...
String query1 = "select t.members From Team t";
String query2 = "select t.members.username From Team t";
query1은 가능한데, query2는 불가능하다는 말이다. 왜냐하면 t.members는 리스트 컬렉션이기 때문에 컬렉션에 username을 가져올 수는 없기 때문이다. 그런데 명시적 조인을 통한 별칭을 얻으면 별칭을 통해 탐색이 가능하다.
String query3 = "select m.username From Team t join t.members m"; // 명시적 조인
컬렉션은 경로 탐색의 끝이다. 따라서 컬렉션에선 더 이상 탐색을 진행할 수 없다. 따라서 t.members.username이 불가능하지만(t.members가 컬렉션이기 때문에), 비슷하게 내부 멤버를 조회하기 위해선 위와 같이 명시적 조인을 해야한다.
조인 예제
'Spring > JPA' 카테고리의 다른 글
JPA- 벌크연산 (0) | 2023.06.19 |
---|---|
JPA-Join Fetch (0) | 2023.06.18 |
JPA- 조건식의 사용 (0) | 2023.06.18 |
JPA-타입 표현 (0) | 2023.05.20 |
JPA- 조인 (0) | 2023.05.14 |