자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런
JPQL 에서 Query 작성 시 객체 그래프 탐색을 표현하는 것을 말한다.
필드 값에 따라 3가지로 구별할 수 있다.
Member
@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;
Team
@Entity
public class Team
{
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
기본타입으로 저장된 필드를 가리키는 경로이다.
위의Member
에서Member
필드의age
,username
을 가리키는 경로이다.String query = "select m.username from Member m";
필드 값을 가리키기 때문에 더 이상 그래프 탐색을 이어나갈 수 없다.
연관관계에 있는 엔티티나 JPA 값 타입 조회 시, 조회 대상이 단일인 경우 경로이다.
String query = "select m.team from Member m";
Hibernate: /* select m.team from Member m */ select team1_.id as id1_3_, team1_.name as name2_3_ from Member member0_ inner join Team team1_ on member0_.TEAM_ID=team1_.id
연관관계에 있는 엔티티 값을 가져오기 때문에
INNER JOIN
이 발생한다.@ManyToOne
,@OneToOne
인 엔티티 간 사용 가능하며String query = "select m.team.name from Member m";
단일 값 연관 경로에 상태 필드를 추가하여 조회 할 수 있다.
JOIN
이 암묵적으로 일어나기 때문에
실제 운영에서 사용하는 것을 지양해야한다. ( 성능 저하 문제 )
명시적 JOIN 사용을 권장
연관관계에 있는 엔티티나 JPA 값 타입 조회 시, 조회 대상이 복수 즉, Collection 타입으로 반환될 때 사용하는 경로.
String query = "select t.members from Team t"; List result = em.createQuery(query, Collection.class) .getResultList(); for (Object o : result) { System.out.println(o); }
Hibernate: /* select t.members from Team t */ select members1_.id as id1_0_, members1_.city as city2_0_, members1_.street as street3_0_, members1_.zipcode as zipcode4_0_, members1_.age as age5_0_, members1_.memberType as memberTy6_0_, members1_.TEAM_ID as TEAM_ID8_0_, members1_.username as username7_0_ from Team team0_ inner join Member members1_ on team0_.id=members1_.TEAM_ID Member{id=2, username='멤버이름01', age=20, address=org.example.entity.Address@2935fd2c} Member{id=3, username='멤버이름02', age=20, address=org.example.entity.Address@3f018494}
마찬가지로 연관관계에 존재하기 때문에
INNER JOIN
이 묵시적으로 발생한다.단일 값 연관 경로
와 다른점이 있다면 반환 되는 값이
복수기 때문에 복수 값들 중 어느 인스턴스를 선택해서
어느 필드를 반환할지 정하기 어렵기 때문에
상태 필드
조회가 불가능하다.
명시적 JOIN 사용을 권장