Spring/QueryDSL

조인 - 기본 조인

느리지만 꾸준하게 2022. 4. 20. 02:18

기본 조인 문법

  • 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다.

 

 

join test를 돌려보면

 /**
     * 팀 A에 소속된 모든 회원
     */
    @Test
    public void join() {
        List<Member> result = queryFactory
                .selectFrom(member)
                // member와 team을 join하고
                .join(member.team, team)
                // teamA에 소속된 애를 찾고 
                .where(team.name.eq("teamA"))
                .fetch();

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

 

실행창에 inner join이 만들어진다. (querydsl은 JPQL의 builder 역할)

/* select
        member1 
    from
        Member member1   
    inner join
        member1.team as team 
    where
        team.name = ?1 */ select
            member0_.id as id1_1_,
            member0_.age as age2_1_,
            member0_.team_id as team_id4_1_,
            member0_.username as username3_1_ 
        from
            member member0_ 
        inner join
            team team1_ 
                on member0_.team_id=team1_.id 
        where
            team1_.name=?

 

 

 

 

leftJoin으로 해보면

@Test
public void join() {
    List<Member> result = queryFactory
            .selectFrom(member)
            // member와 team을 join하고
            // leftjoin / rightjoin도 가능
            .leftJoin(member.team, team)
            // teamA에 소속된 애를 찾고
            .where(team.name.eq("teamA"))
            .fetch();

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

 

아래와 같이 left join이 나오게 된다.

/* select
        member1 
    from
        Member member1   
    left join
        member1.team as team 
    where
        team.name = ?1 */ select
            member0_.id as id1_1_,
            member0_.age as age2_1_,
            member0_.team_id as team_id4_1_,
            member0_.username as username3_1_ 
        from
            member member0_ 
        left outer join
            team team1_ 
                on member0_.team_id=team1_.id 
        where
            team1_.name=?

 

 

 

연관관계 없이도 join을 할 수 있는데 세타조인이(막조인이라고 우스갯소리로 한다.) 있다.

/**
     * 세타 조인
     * 회원의 이름이 팀 이름과 같은 회원 조회
     */
    @Test
    public void theta_join() {
        em.persist(new Member("teamA"));
        em.persist(new Member("teamB"));
        em.persist(new Member("teamC"));


        // 세타 조인은 from절을 나열
        // 일반적으로 말하는 join은 => .join(member.team, team)
        // 모든 회원을 가져오고 모든 팀을 가져온 다음에 싹다 조인을 해버린다. => 세타조인
        // 그런 다음에 where 절에서 필터링을 거친다.
        List<Member> result = queryFactory
                .select(member)
                .from(member, team)
                // 회원의 이름과 팀 이름이 같은 사람을 조인 해온다.
                .where(member.username.eq(team.name))
                .fetch();

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

    // 정리
    // 세타조인 => 모든 멤버 팀 테이블 다 조인 -> 조인한 ㅁ 테이블에서 멤버이름 팀 이름 같은거를 찾아서 결과 가져온다.(teamA, teamB / teamC는 빠진다.)
// JPQL
// 아래를 보면 카르테시안 join으로 다 join 해주고
/* select
        member1 
    from
        Member member1   
    left join
        member1.team as team 
    where
        team.name = ?1
        
        
// SQL
// Cross JOIN
select
            member0_.id as id1_1_,
            member0_.age as age2_1_,
            member0_.team_id as team_id4_1_,
            member0_.username as username3_1_ 
        from
            member member0_ 
        left outer join
            team team1_ 
                on member0_.team_id=team1_.id 
        where
            team1_.name=?

 

 

 

 

세타조인

  • 연관관계가 없는 필드로 조인
  • from 절에 여러 엔티티를 선택해서 세타조인
  • 외부 조인 불가능(left outer join, right outer join) 하지만

 

  • 조인 on을 사용하면 외부 조인 가능
  • 하이버네이트가 최신버전을 들어오면서 전혀 연관관계가 없는 테이블도 left join을 할 수 있는 방법이 있다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 실전! Querydsl >

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...

www.inflearn.com

 

'Spring > QueryDSL' 카테고리의 다른 글

조인 - 페치 조인  (0) 2022.04.20
조인 - on 절  (0) 2022.04.20
집합  (0) 2022.04.20
정렬 & 페이징  (0) 2022.04.20
결과 조회  (0) 2022.04.20