조인 - 기본조인

학습 페이지

조인의 가장 기본문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 대상의 별칭으로 사용할 Q타입을 지정하면 된다.

    /**
     * TeamA에 속한 모든 회원(Team과 Member)
     */
    @Test
    public void join() {
        List<Member> fetch = queryFactory
                .selectFrom(member)
                .join(member.team, team)
                .where(team.name.eq("teamA"))
                .fetch();

        assertThat(fetch).extracting("username").containsExactly("member1", "member2");
    }

image.png

위에서는 member가 다이므로, member를 주인으로 join했다.

image.png

만들어진 jpql을 보면 inner join 을 하고 있다.

left join, right join 도 가능하다.

 List<Member> fetch = queryFactory
                .selectFrom(member)
                **.leftJoin**(member.team, team) //다쪽을 주인공으로 join
                .where(team.name.eq("teamA"))
                .fetch();

image.png

연관관계 없는 테이블간에서도 on 으로 join할 수 있다.

그리고 on없이 그냥 아무런 관계 없는 친구들을 where절만으로도 join할 수도 있다. 이를 JPA에선 theta join이라고 한다.

  @Test
    public void theta_join() {
        em.persist(new Member("teamA"));
        em.persist(new Member("teamB"));
        em.persist(new Member("teamC"));

        List<Member> fetch = queryFactory
                .select(member)
                .from(member, team) //from절에 테이블 두개를 나열한다.
                .where(member.username.eq(team.name))
                .fetch();

        assertThat(fetch)
                .extracting("username")
                .containsExactly("teamA", "teamB");
    

image.png

이 theta 조인은 김영한님은 막조인이라고도 부름.

원리는 from절에서 해당 테이블의 모든 데이터를 들고 온 후 조인한 후(카테시안 곱), 그다음에 where절을 통해 결과를 필터링해 반환하는 방식이다.