01. 경로 표현식이란?
경로 표현식이란 .(점)
을 찍어 객체 그래프를 탐색하는 것이다.
3가지 경로 표현식이 존재한다. 세 가지 중 어떤 것을 사용하느냐에 따라 내부 동작이 달라지기 때문에 반드시 이해하고 사용해야 한다.
02. 경로 표현식 용어 정리
상태 필드(state field) : 단순히 값을 저장하기 위한 필드이다. 예시로는 select m.username
이 있다.
연관 필드(association field) : 연관관계를 위한 필드이다. 단일 값 연관 필드와 컬렉션 값 연관 필드로 나뉜다.
단일 값 연관 필드 : @ManyToOne
, @OneToOne
에 사용하며 대상이 엔티티이다. 예시로는 join m.team t
이 있다.
컬렉션 값 연관 필드 : @OneToMany
, @ManyToMany
에 사용하며 대상이 컬렉션이다. 예시로는 join m.orders o
가 있다.
03. 경로 표현식 특징
상태 필드는 경로 탐색의 끝으로, 더 탐색이 불가능하다. 단순 필드 조회라고 생각하면 된다.
단일 값 연관 경로는 묵시적 내부 조인 (inner join)이 발생하며, 탐색이 가능하다.
컬렉션 값 연관 경로는 묵시적 내부 조인이 발생하며, 탐색이 불가능하다.
04. 단일 값 연관 경로 예시
아래 코드를 실행하고 로그를 보면
Member member1 = new Member();
member1.setUsername("관리자1");
em.persist(member1);
Member member2 = new Member();
member2.setUsername("관리자2");
em.persist(member2);
em.flush();
em.clear();
String query = "select m.team From Member m";
List<Team> result = em.createQuery(query, Team.class)
.getResultList();
for (Team s : result) {
System.out.println("s = " + s);
}
다음과 같다. 객체 입장에서는 단순히 .을 찍는 것이지만 실제 나가는 쿼리에는 inner join이 포함되어 있다.
실무에서는 묵시적인 내부 조인이 발생하게 쿼리를 짜면 안된다. 조인은 성능 튜닝에 많은 영향을 준다.
05. 컬렉션 값 연관 관계 경로 예시
예시 코드는 다음과 같다.
Team team = new Team();
em.persist(team);
Member member1 = new Member();
member1.setUsername("관리자1");
member1.setTeam(team);
em.persist(member1);
Member member2 = new Member();
member2.setUsername("관리자2");
member2.setTeam(team);
em.persist(member2);
em.flush();
em.clear();
String query = "select t.members From Team t";
Collection result = em.createQuery(query, Collection.class)
.getResultList();
for (Object o : result) {
System.out.println("o = " + o);
}
컬렉션 값 연관 관계 경로는 탐색이 불가능하다. 탐색을 하고싶다면 다음과 같이 명시적 조인을 사용해야 한다.
String query = "select m.username From Team t join t.members m";
06. 기타 예시
select o.member.team from Order o
: inner join이 2번 발생하고, 쿼리는 성공한다.
select t.members from Team
: 컬렉션이지만 더 이상 탐색을 하지 않았기 때문에 쿼리는 성공한다.
select t.members.username From Team t
: 컬렉션이라서 더 이상 탐색이 불가능하여 쿼리가 실패한다.
select m.username from Team t join t.members m
: 컬렉션을 명시적 조인 후 별칭 m을 가져와서 쿼리가 성공한다.
'JPA' 카테고리의 다른 글
페치 조인 1 - 기본 (1) | 2024.02.10 |
---|---|
엔티티 작성 시 주의사항 (2) | 2024.01.30 |
객체지향 쿼리 언어1 - 프로젝션 (SELECT) (0) | 2024.01.18 |
객체지향 쿼리 언어1 - 기본 문법과 쿼리 API (0) | 2024.01.18 |
값 타입 컬렉션 (0) | 2024.01.18 |