<인프런의 김영한님의 강의를 보고 정리한 내용입니다>
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
@Entity
@Table(name = "ORDERS")
public class Order {
@Id @GeneratedValue
private Long id;
private int orderAmount;
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Member member;
}
엔티티들이 이렇게 연관관계를 가진다고 할 때,
select m.username /* 상태필드 */
from Member m
join m.team t /* 단일 값 연관 필드 */
join m.orders o /* 컬렉션 값 연관 필드 */
where t.name = '팀A'
이렇게 3가지 경로 표현식이 있는데 이 3가지 모두 동작하는 방식이 다르다.
그래서 구분해서 이해해야 한다. 정리를 해보면
여기서 말하는 명시적 조인과 묵시적 조인은 무엇일까?
컬렉션 값 연관 필드에서
select t.member.username From Team t는 되지 않으므로 명시적 조인을 사용해야 한다.
select m.username From Team t join t.members m 이런 식으로 사용해야 한다. 즉 명시적 조인으로 별칭인 m을 얻은 후에 접근하면 된다.
현업에서는 묵시적 조인을 사용하는 것을 추천하지 않는다고 한다.
명시적 조인을 써야 실제 쿼리 튜닝도 쉽다.
[ JPA ] 페치 조인 (fetch join) - 한계 (0) | 2022.02.02 |
---|---|
[ JPA ] 페치 조인 (fetch join) - 기본 (0) | 2022.02.02 |
[ JPA ] jpql 페이징 (0) | 2022.01.29 |
[ JPA ] 값 타입 리스트 동작 방식 (0) | 2022.01.28 |
[ JPA ] 임베디드 타입 (0) | 2022.01.26 |