조인
기본 조인
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
/**
* 팀A에 소속된 모든 회원
*/
@Test
public void join() throws Exception {
QMember member = QMember.member;
QTeam team = QTeam.team;
List<Member> result = queryFactory
.selectFrom(member)
// 멤버와 팀을 조인한다.
.join(member.team, team)
.where(team.name.eq("teamA"))
.fetch();
assertThat(result).extracting("username")
}
}join(), innerJoin()
inner join
leftJoin()
left outer join
rightJoin()
right outer join
JPQL의 on과 성능 최적화를 위한 fetch join도 제공한다.
세타 조인
연관 관계가 없는 필드로 조인한다.
from에 여러 엔티티를 선택해서 세타 조인 한다.
outer join은 불가하다.
on을 사용하면 outer join이 가능해진다.
on절
조인 대상 필터링
회원과 팀을 조인하면서 팀 이름이 teamA인 것만 조인한다.
회원은 모두 조회한다.
inner join을 사용하면 where에서 필터링하는 것과 동일하다.
inner join이라면 익숙한 where절로 해결한다.
outer join이 필요한 경우에만 on절을 사용한다.
left join이므로 teamB는 null인 상태로 조회한다.
연관 관계 없는 엔티티 외부 조인
회원의 이름과 팀의 이름이 같은 데이터를 outer join 한다.
하이버네이트 5.1부터 관계 없는 필드로도 on으로 외부 조인할 수 있다.
일반 조인과 다르게 엔티티 하나만 넘긴다.
일반 조인
leftJoin(member.team, team)
id가 매칭되는 것을 가져온다.
on 조인
from(member).leftJoin(team).on()
on 조건으로만 필터링 한다.
SQL을 보면 id 없이 이름으로만 매칭한다.
이름이 매칭되는 것만 team 데이터를 조인해서 가져왔다.
fetch join
fetch join은 SQL이 제공하는건 아니고 SQL 조인을 활용해 한 방에 조회하는 기능이다.
성능 최적화에서 주로 사용한다.
before
after
join(), leftJoin() 등 조인 뒤에 fetchJoin()을 추가한다.
Last updated
Was this helpful?