조인 - 기본 조인
가장 간단한 예제, Member와 Team의 조인
List<Member> result = queryFactory
.selectFrom(member)
.join(member.team, team)
.where(team.name.eq("teamB"))
.fetch();
조인 - 왼쪽 외부 조인
List<Member> result = queryFactory
.selectFrom(member)
.leftJoin(member.team, team)
.where(team.name.eq("teamB"))
.fetch();
세타 조인(옵시디언)
/**
* 억지성 예제, 회원의 이름이 팀의 이름과 같은 회원을 조회
*/
em.persist(generateMember("teamA", 7, null));
em.persist(generateMember("teamB", 13, null));
em.persist(generateMember("teamC", 31, null));
List<Member> result = queryFactory
.select(member)
// 세타조인이므로 단순히 나열임
.from(member, team)
.where(member.username.eq(team.name))
.fetch();
조인 - ON 절
on절은 leftJoin일 때만 on으로 조인 조건을 줄일 수 있다.
일반 조인일 때는 where를 사용해야한다.
List<Tuple> result = queryFactory
.select(member, team)
.from(member)
.leftJoin(member.team, team)
.on(team.name.eq("teamA"))
.fetch();
연관관계가 없는 엔티티를 외부조인
아래의 예제는 회원의 이름과 팀의 이름이 같은 회원을 조회하는 쿼리이다.
em.persist(generateMember("teamA", 7, null));
em.persist(generateMember("teamB", 13, null));
em.persist(generateMember("teamC", 31, null));
List<Tuple> result = queryFactory
.select(member, team)
// 세타조인이므로 단순히 나열임
.from(member)
.leftJoin(team)
.on(member.username.eq(team.name))
.where(member.username.eq(team.name))
.fetch();
Fetch Join
FetchJoin을 사용하지 않는 경우
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1"))
.fetchOne();
로딩이 되었는지 알려주는 메서드
위 findMember의 Team이 실제로 프록시 객체인지, 실제 엔티티 객체인지 로딩이 되었는지 알려주는 메서드가 있다.
boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());
assertThat(loaded).as("페치 조인 미적용").isFalse(); // true
FetchJoin을 사용한 경우
Member findMember = queryFactory
.selectFrom(member)
.join(member.team, team)
.fetchJoin()
.where(member.username.eq("member1"))
.fetchOne();
FetchJoin을 사용했기 때문에, Member와 Team이 함께 조회된다.
boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());
assertThat(loaded).as("페치 조인 적용").isTrue(); //true
'JPA > QueryDSL' 카테고리의 다른 글
[QueryDSL] 6. 동적 쿼리(중요⭐️) - BooleanBuilder, Where 다중 파라미터 사용 (0) | 2023.12.06 |
---|---|
[QueryDSL] 5. QueryDSL의 프로젝션과 결과 반환, @QueryProjection (0) | 2023.12.06 |
[QueryDSL] 3. 정렬과 페이징, SubQuery (0) | 2023.12.04 |
[QueryDSL] 2. QueryDSL 문법 VS JPQL 문법 비교 (0) | 2023.12.01 |
[QueryDSL] 1. QueryDSL 의존성과 기본 사용법 (0) | 2023.12.01 |