기본 조인 문법
- 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다.
join test를 돌려보면
/**
* 팀 A에 소속된 모든 회원
*/
@Test
public void join() {
List<Member> result = queryFactory
.selectFrom(member)
// member와 team을 join하고
.join(member.team, team)
// teamA에 소속된 애를 찾고
.where(team.name.eq("teamA"))
.fetch();
assertThat(result)
.extracting("username")
.containsExactly("member1", "member2");
}
실행창에 inner join이 만들어진다. (querydsl은 JPQL의 builder 역할)
/* select
member1
from
Member member1
inner join
member1.team as team
where
team.name = ?1 */ select
member0_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
inner join
team team1_
on member0_.team_id=team1_.id
where
team1_.name=?
leftJoin으로 해보면
@Test
public void join() {
List<Member> result = queryFactory
.selectFrom(member)
// member와 team을 join하고
// leftjoin / rightjoin도 가능
.leftJoin(member.team, team)
// teamA에 소속된 애를 찾고
.where(team.name.eq("teamA"))
.fetch();
assertThat(result)
.extracting("username")
.containsExactly("member1", "member2");
}
아래와 같이 left join이 나오게 된다.
/* select
member1
from
Member member1
left join
member1.team as team
where
team.name = ?1 */ select
member0_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
left outer join
team team1_
on member0_.team_id=team1_.id
where
team1_.name=?
연관관계 없이도 join을 할 수 있는데 세타조인이(막조인이라고 우스갯소리로 한다.) 있다.
/**
* 세타 조인
* 회원의 이름이 팀 이름과 같은 회원 조회
*/
@Test
public void theta_join() {
em.persist(new Member("teamA"));
em.persist(new Member("teamB"));
em.persist(new Member("teamC"));
// 세타 조인은 from절을 나열
// 일반적으로 말하는 join은 => .join(member.team, team)
// 모든 회원을 가져오고 모든 팀을 가져온 다음에 싹다 조인을 해버린다. => 세타조인
// 그런 다음에 where 절에서 필터링을 거친다.
List<Member> result = queryFactory
.select(member)
.from(member, team)
// 회원의 이름과 팀 이름이 같은 사람을 조인 해온다.
.where(member.username.eq(team.name))
.fetch();
assertThat(result)
.extracting("username")
.containsExactly("teamA", "teamB");
}
// 정리
// 세타조인 => 모든 멤버 팀 테이블 다 조인 -> 조인한 ㅁ 테이블에서 멤버이름 팀 이름 같은거를 찾아서 결과 가져온다.(teamA, teamB / teamC는 빠진다.)
// JPQL
// 아래를 보면 카르테시안 join으로 다 join 해주고
/* select
member1
from
Member member1
left join
member1.team as team
where
team.name = ?1
// SQL
// Cross JOIN
select
member0_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
left outer join
team team1_
on member0_.team_id=team1_.id
where
team1_.name=?
세타조인
- 연관관계가 없는 필드로 조인
- from 절에 여러 엔티티를 선택해서 세타조인
- 외부 조인 불가능(left outer join, right outer join) 하지만
- 조인 on을 사용하면 외부 조인 가능
- 하이버네이트가 최신버전을 들어오면서 전혀 연관관계가 없는 테이블도 left join을 할 수 있는 방법이 있다.
<출처 김영한: 실전! Querydsl >
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
실전! Querydsl - 인프런 | 강의
Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...
www.inflearn.com