[JPA] JPQL의 경로표현식이란?

2024. 12. 27. 10:46·JPA

 

경로 표현식이란?

.(점)을 찍허 객체 그래프를 탐색하는 것이다.

다음과 같은 코드가 있다고 가정해보자.

@Entity
public class Member {


    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
    
    private String username;
}

단순히 Team은 @ManyToOne으로 다대일 연관관계를 맺어주고, Order는 @OneToMany로 일대다 연관관계를 맺어주었다. 이 필드들을 경로 표현식으로 탐색하자면 다음과 같다. 

경로 표현식 예

  • 상태 필드: 단순히 값을 저장하기 위한 필드
  • 연관 필드: 연관관계를 위한 필드
    • 단일 값 연관필드(@ManyToOne, @OneToOne): 대상이 엔티티
    • 컬렉션 값 연관 필드(@OneToMany, @ManyToMany): 대상이 컬렉션

경로 표현식 특징

상태필드: 경로 탐색의 끝이다. 더이상 탐색을 안한다. 

단일 값 연관 필드: 묵시적 내부 조인 발생, 더 탐색을 할 수 있다.

            String query = "select m.team from Member m";
            List<Team> resultList = em.createQuery(query, Team.class).getResultList();
            for (Team team : resultList) {
                System.out.println("team.getName() = " + team.getName());
            }

query에 m.team으로 단일 값 연관 필드를 조회해보자.

Hibernate: 
    select
        t1_0.id,
        t1_0.name 
    from
        member m1_0 
    join
        team t1_0 
            on t1_0.id=m1_0.team_id
team.getName() = teamA

JPQL에서는 Member을 조회하는 쿼리를 작성했지만 실행결과에서의 from절에 Team을 JOIN해서 조회하는것을 볼 수 있다.

이걸 묵시적 내부조인이라고 한다. 이러한 기능은 매우 편리해보이지만 매우 조심해야한다.

쿼리가 한두개가 아닌 몇십개가 나가야할 때는 버그가 발생할 수도 있고 튜닝하기도 매우 어렵기 때문이다. 

 

컬렉션 값 연관 경로: 묵시적 내부 조인 발생한다. 더이상 탐색은 안된다.

@Entity
public class Team {

    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();

    private String name;

    @Override
    public String toString() {
        return "Team [id=" + id + ", name=" + name + "]";
    }
}

더이상 탐색이 안되는 것을 볼 수 있다.

 

일대 다 관계는 컬렉션의 안에있는 값들이 몇개들어있는지도 모르고, 어느 필드를 꺼내야할지 난감하다. JPA에서는 컬렉션 값 연관필드는 묵시적 내부조인은 발생하지만 탐색은 못하는 제약을 뒀다. 

그러면 탐색이 아예 불가능하다?는 아니다. 

            String query = "select m.username from Team t join t.members m";
            em.createQuery(query, Member.class).getResultList();

FROM절의 명시적 조인을 활용하면 탐색이 가능하게 된다.

'JPA' 카테고리의 다른 글

[JPA] 페치조인과 일반 조인의 차이점  (1) 2024.12.27
[JPA] JPQL의 프로젝션, 페이징  (0) 2024.12.24
[JPA] JPA의 타입 (임베디드 타입, 값 타입, 컬렉션 타입)이란?  (1) 2024.12.20
[JPA] 프록시와 지연로딩, 즉시로딩  (0) 2024.11.26
[JPA] 연관관계 매핑  (0) 2024.11.25
'JPA' 카테고리의 다른 글
  • [JPA] 페치조인과 일반 조인의 차이점
  • [JPA] JPQL의 프로젝션, 페이징
  • [JPA] JPA의 타입 (임베디드 타입, 값 타입, 컬렉션 타입)이란?
  • [JPA] 프록시와 지연로딩, 즉시로딩
Economy98
Economy98
공부하고 기록하기
  • Economy98
    Economy_Dev
    Economy98
  • 전체
    오늘
    어제
    • 분류 전체보기 (76) N
      • Spring Framework (12)
      • BOJ, Programmers (22)
      • Java (5) N
      • JDBC (6)
      • JPA (9)
      • Spring Transaction (3)
      • Algorithm (1)
      • Web (5)
      • Projects (2)
        • 쇼핑몰 프로젝트 (0)
        • 열람실 & 도서관 프로젝트 (2)
      • Network (2)
      • 나의 공부방 (5)
      • 끄적끄적 (1)
      • Error Log (3)
      • CS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백준 풀이
    jdbc
    브루트포스 알고리즘
    스프링
    트랜잭션
    자바 문제 풀이
    propagation
    자바
    백준
    restful api
    백준 자바 풀이
    스프링부트
    자바 문제
    예외 처리
    java
    정렬
    Spring
    JPA
    다이나믹 프로그래밍
    그리디 알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Economy98
[JPA] JPQL의 경로표현식이란?
상단으로

티스토리툴바