- 페치 조인 DISTINCT
Team team1 = new Team();
team1.setName("팀A");
em.persist(team1);
Team team2 = new Team();
team2.setName("팀B");
em.persist(team2);
Member member1 = new Member();
member1.setUsername("회원1");
member1.setTeam(team1);
em.persist(member1);
Member member2 = new Member();
member2.setUsername("회원2");
member2.setTeam(team1);
em.persist(member2);
Member member3 = new Member();
member3.setUsername("회원3");
member3.setTeam(team2);
em.persist(member3);
em.flush();
em.clear();
// //컬렉션 패치 조인
String query = "select distinct t From Team t join fetch t.members";
System.out.println("===========================================111");
List<Team> result = em.createQuery(query, Team.class)
.getResultList();
System.out.println("===========================================222");
for (Team team : result) {
System.out.println("===========================================333");
System.out.println("team = " + team.getName() + "| members = " + team.getMembers().size());
System.out.println("===========================================444");
for (Member member : team.getMembers()) {
System.out.println("-> member = " + member);
}
}
1. SQL의 DISTINCT는 중복된 결과를 제거하는 명령을 내린다.
1.1. 단, DB에서 DISTINCT는 결과가 완벽하게 일치해야 중복을 제거한다.
2. JPA는 같은 식별자를 가진 엔티티를 제거한다.
* 하이버네이트6부터는 DISTINCT 명령어를 사용하지 않아도 애플리케이션에서 중복이 자동으로 제거된다.
- 페치 조인과 일반 조인의 차이
1. 일반 조인
[JPQL]
select t
from Team t join t.members m
where t.name = ‘팀A'
[SQL]
SELECT T.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID
WHERE T.NAME = '팀A'
----------------------------------------
2. 페치 조인
[JPQL]
select t
from Team t join fetch t.members
where t.name = ‘팀A'
[SQL]
SELECT T.*, M.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID
WHERE T.NAME = '팀A'
- 일반 조인
1. 일반 조인은 실행시 연관된 엔티티를 함께 조회하지 않는다.
2. JPQL은 결과를 반환할 때 연관관계를 고려하지 않는다.
3. SELECT절에 지정한 엔티티만 조회한다.
4. 일반 조인은 팀 엔티티만 조회하고 회원 엔티티는 조회하지 않는다.
- 페치 조인
1. 페치 조인은 사용할 때만 연관된 엔티티도 함께 조회한다.(즉시 로딩)
2. 페치 조인은 객체 그래프를 SQL 한번에 조회하는 개념이다.
- 페치 조인의 특징과 한계
- 한계
1. 페치 조인 대상에는 별칭을 줄 수 없다.
2. 둘 이상의 컬렉션은 페치 조인 할 수 없다.
2. 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다.
-특징
1. 연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화
2. 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선함
3. 실무에서 글로벌 로딩 전략은 모두 지연 로딩
4. 최적화가 필요한 곳은 페치 조인 적용
출처 : 인프런 - 김영한 (자바 ORM 표준 JPA 프로그래밍 - 기본편)
'Programming > JPA' 카테고리의 다른 글
JPA - 벌크 연산 (0) | 2023.07.19 |
---|---|
JPA - 엔티티 직접 사용 (0) | 2023.07.19 |
JPA - 페치 조인 (1) (0) | 2023.07.19 |
JPA - 경로 표현식 (0) | 2023.07.18 |
JPA - 기본 문법 (조건식(CASE 등등), JPQL 함수) (0) | 2023.07.18 |