조인

기본 조인

@SpringBootTest
@Transactional
public class QuerydslBasicTest {

    /**
     * 팀A에 소속된 모든 회원
     */
    @Test
    public void join() throws Exception {
        QMember member = QMember.member;
        QTeam team = QTeam.team;

        List<Member> result = queryFactory
                .selectFrom(member)
                // 멤버와 팀을 조인한다.
                .join(member.team, team)
                .where(team.name.eq("teamA"))
                .fetch();

        assertThat(result).extracting("username")
    }
}
  • join(), innerJoin()

    • inner join

  • leftJoin()

    • left outer join

  • rightJoin()

    • right outer join

  • JPQL의 on과 성능 최적화를 위한 fetch join도 제공한다.

세타 조인

  • 연관 관계가 없는 필드로 조인한다.

  • from에 여러 엔티티를 선택해서 세타 조인 한다.

  • outer join은 불가하다.

    • on을 사용하면 outer join이 가능해진다.

on절

조인 대상 필터링

  • 회원과 팀을 조인하면서 팀 이름이 teamA인 것만 조인한다.

  • 회원은 모두 조회한다.

  • inner join을 사용하면 where에서 필터링하는 것과 동일하다.

    • inner join이라면 익숙한 where절로 해결한다.

    • outer join이 필요한 경우에만 on절을 사용한다.

  • left join이므로 teamB는 null인 상태로 조회한다.

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

  • 회원의 이름과 팀의 이름이 같은 데이터를 outer join 한다.

  • 하이버네이트 5.1부터 관계 없는 필드로도 on으로 외부 조인할 수 있다.

  • 일반 조인과 다르게 엔티티 하나만 넘긴다.

    • 일반 조인

      • leftJoin(member.team, team)

      • id가 매칭되는 것을 가져온다.

    • on 조인

      • from(member).leftJoin(team).on()

      • on 조건으로만 필터링 한다.

        • SQL을 보면 id 없이 이름으로만 매칭한다.

  • 이름이 매칭되는 것만 team 데이터를 조인해서 가져왔다.

fetch join

  • fetch join은 SQL이 제공하는건 아니고 SQL 조인을 활용해 한 방에 조회하는 기능이다.

  • 성능 최적화에서 주로 사용한다.

before

after

  • join(), leftJoin() 등 조인 뒤에 fetchJoin()을 추가한다.

Last updated

Was this helpful?