JPA 2.1 부터 지원한다.

2번째 경우가 필요할 때 많이 쓰인다.

기본적으로 on 절은 조인 대상을 필터링 할 때 사용한다!

조인 대상 필터링

/**
 * 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회
 */
@Test
public void join_on_filtering() {
	List<Tuple> result = queryFactory
			.select(member, team)
			.from(member)
			.leftJoin(member.team, team)
			.on(team.name.eq("teamA"))
			.fetch();

	assertThat(result.size()).isEqualTo(4);

	for (Tuple tuple : result) {
		System.out.println("tuple = " + tuple);
	}
}

연관관계가 없는 엔티티의 외부 조인

/**
 * 연관 관계가 없는 엔티티 외부 조인
 * 회원의 이름이 팀 이름과 같은 회원 외부 조인
 */
@Test
public void join_on_no_relation() {
	em.persist(new Member("teamA"));
	em.persist(new Member("teamB"));
	em.persist(new Member("teamC"));

	List<Tuple> result = queryFactory
			.select(member, team)
			.from(member)
			.leftJoin(team).on(member.username.eq(team.name))
			.fetch();

	for (Tuple tuple : result) {
		System.out.println(tuple);
	}
}