본문 바로가기

Spring/JPA

JPA- 경로 표현식

경로 표현식

 상태필드

  상태필드는 단순히 값을 저장하기 위한 필드로 엔티티의 내부 멤버 변수라고 생각하면 된다.

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