오늘은 간단하게 querydsl 에서 여러가지 join을 사용하는 방법을 정리해보고자 한다.
1. join (inner join)
먼저 가장 일반적인 inner join은 아래와 같이 사용하면 된다.
주석의 내용은 참고만 하길 바란다.
List<Member> result = queryFactory
.selectFrom(member)
.join(member.team, team) // innerJoin 과 같음
//.rightJoin(member.team, team) // right outer join
//.leftJoin(member.team, team) // left outer join
.where(team.name.eq("a"))
//.on(team.name.eq("a")) // 이것과 where 절은 결과가 같음.. inner join이라서
.fetch();
2. theta Join
아예 연관관계가 없는 테이블 끼리 join이 가능하다.
예시로 만든건 회원 정보를 저장하는 member 테이블과 팀정보를 저장하는 team 테이블 에서 회원이름과 팀이름이 같은 경우 join을 하는 방법을 작성해 놓았다. 즉 이렇게 from 절에서 여러 엔티티를 선택하는 경우를 세타 조인이라고 한다.
(엄밀히 말해서 세타 조인을 정의해보면 조인(join) 연산은
카타시안 곱 (cartesian product) + 선택 연산 (select operation)
의 형태로 이루어 지는데 선택연산의 비교 연산자가 = , < , > 등이 사용되는 연산이 세타조인이다.
여기서 비교연산자가 = 이면 동등 조인 (equi join) 이라고 한다. )
세타 조인에서 left outer join이나 right outer join 같은 외부 조인은 불가능하다.
사용 예제는 아래를 참고하자.
List<Member> result = queryFactory
.select(member)
.from(member, team)
.where(member.userName.eq(team.name))
.fetch();
3. on 절
querydsl에서 on절은 JPA 2.1 이상부터 적용이 가능하다.
1) 필터링 기능
on절을 이용하여 조인 대상을 필터링하는 기능을 사용할 수 있다.
예시를 보면 팀이름이 "a" 인 팀만 조회하고 회원은 모두 조회하는 left outer join기능을 구현했다.
이렇게 하면 team 이름이 "a" 인 팀 정보는 표시가 되고 그외의 팀정보는 null 로 표시된 tuple 값들이 나올 것이다.
List<Tuple> result = queryFactory
.select(member, team)
.from(member)
.leftJoin(member.team, team).on(team.name.eq("a"))
.fetch();
2) 연관관계 없는 테이블끼리 외부 조인
아까전에 세타 조인에서는 외부조인이 불가능하다고 했다. 이럴 때 외부조인을 할 일이 있으면 on 절을 이용하면된다.
여기서 문법을 잘 봐야한다. 일반 조인에서는 id 값을 매핑시키기 때문에 연관관계 주인 객체에서 join하고자하는 객체를 꺼내서 매핑 시키는 방식이라면 on 절에서는 그냥 그 객체를 그대로 꺼낸다.
흠 ... 조금 말이 어렵나..?
예제를 보면 좀 쉽게 이해 되실수도 있다.
List<Tuple> result = queryFactory
.select(member, team)
.from(member)
//.leftJoin(member.team, team) // 기존에 leftJoin을 할때 member의 team을 꺼내서 함 , 이렇게하면 id 값으로 매칭
.leftJoin(team).on(member.userName.eq(team.name)) // 이름으로만 매칭
.fetch();
3. fetch join
페치 조인은 jpa 사용시 가장 기본적으로 사용하는 성능 최적화 방식이다. 연관된 엔티티나 컬렉션을 한번에 같이 조회해온다.
Member findMember = queryFactory
.selectFrom(member)
.join(member.team, team).fetchJoin()
.where(member.userName.eq("kang"))
.fetchOne();
'Develop > Spring' 카테고리의 다른 글
[querydsl] concat 사용법 (문자열 붙이기) (1) | 2021.07.07 |
---|---|
[querydsl] querydsl 에서 서브쿼리 사용하는 법 (1) | 2021.07.05 |
JPQL vs QueryDSL 간단 비교 (1) | 2021.06.30 |
[querydsl] queryDsl 기본 문법 정리 - fetch, sort, paging, aggregation (0) | 2021.06.30 |
[queryDsl] QueryDsl 프로젝트 환경 세팅하기 (0) | 2021.06.29 |
댓글