경로표현식

XingXi·2024년 1월 7일
0

JPA

목록 보기
20/23
post-thumbnail

🍕 Reference

자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런

경로표현식

JPQL 에서 Query 작성 시 객체 그래프 탐색을 표현하는 것을 말한다.

종류

필드 값에 따라 3가지로 구별할 수 있다.

  1. 상태 경로
  2. 단일 값 경로
  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<>();

1. 상태 경로

기본타입으로 저장된 필드를 가리키는 경로이다.
위의 Member 에서 Member 필드의 age, username 을 가리키는 경로이다.

String query = "select m.username from Member m";

필드 값을 가리키기 때문에 더 이상 그래프 탐색을 이어나갈 수 없다.

2. 단일 값 연관 경로

연관관계에 있는 엔티티나 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 사용을 권장

3. 컬렉션 값 연관 경로

연관관계에 있는 엔티티나 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 사용을 권장

0개의 댓글