JPA

(Querydsl) ON 절을 활용한 조인

쿠카이든 2022. 2. 14. 12:22
728x90
  • (Querydsl) ON 절을 활용한 조인
/**
 * 예) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회
 * SQL: SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='teamA'
 */
@Test
public void join_on_filtering() throws Exception {
    List<Tuple> result = queryFactory
        .select(member, team)
        .from(member)
        .leftJoin(member.team, team).on(team.name.eq("teamA"))
        .fetch();
    for (Tuple tuple : result) {
        System.out.println("tuple = " + tuple);
    }
}
  • 결과
t=[Member(id=7, username=member5, age=5), Team(id=1, name=teamA)]
t=[Member(id=8, username=member6, age=10), Team(id=1, name=teamA)]
t=[Member(id=9, username=member7, age=15), null]
t=[Member(id=0, username=member8, age=25), null]
  • 코드 설명
    • on 절을 활용해 조인 대상을 필터링 할 때, 외부조인이 아니라 내부조인(inner join)을 사용하면, where 절에서 필터링 하는 것과 기능이 동일합니다.
    • 따라서 on 절을 활용한 조인 대상 필터링을 사용할 때, 내부조인 이면 익숙한 where 절로 해결하고, 정말 외부조인이 필요한 경우에만 이 기능을 사용하는 것이 좋습니다.
  • Tuple 타입 관련 참고
    • JPA는 Map과 비슷한 com.mysema.query.Tuple 이라는 타입을 통해 결과를 반환합니다.
    • select 절이 조회할 대상을 지정하는 것입니다.
    • 프로젝션 대상 컬럼이 하나일 때
JPAQuery query = new JPAQuery(em);
QMember member = QMember.member;
List<String> names = query.from(member).list(member.username);
for (String name : names) {
	System.out.println(name);
}
  • 프로젝션 대상 컬럼이 여러개 일 때
    • tuple 타입으로 변수에 저장 후, get()으로 가져올 수 있음
JPAQuery query = new JPAQuery(em);
QMember member = QMember.member;
List<Tuple> tupleList = query.from(member).list(member.username, member.age);
for (Tuple tuple : tupleList) {
	System.out.println(tuple.get(member.username));
	System.out.println(tuple.get(member.age));
}
728x90