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
'JPA' 카테고리의 다른 글
회원등록 API v1, v2 차이 (0) | 2022.02.14 |
---|---|
변경 감지(dirty check)와 병합(merge) (0) | 2022.02.14 |
queryDsl 기본 조인에 대해 (0) | 2022.02.14 |
Q클래스 인스턴스 사용 방법 두가지 (0) | 2022.02.14 |
JPAQueryFactory를 필드에서 제공하자(feat. 동시성 문제는 스프링이 해결) (0) | 2022.02.14 |