본문 바로가기
Spring/Querydsl

Query DSL - Join

by 행운의나무 2022. 7. 3.
728x90
반응형
  • 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭으로 사용할 Q 타입 지정

DB

  • Team Table

team table

  • Member Table

member table

기본 조인

join(조인 대상, 별칭으로 사용할 Q타입)

  • join(), innerJoin() : 내부 조인 (inner join)
  • leftJoin() : left 외부 조인
  • rightJoin() : right 외부 조인
  • JPQL의 on과 성능 최적화를 위한 fecth 조인 제공 
@Repository 
public class MemberRepositorySupport extends QuerydslRepositorySupport { 
	// team 아이디가 1번인 회원 리스트 출력 
    public List findMemberJoin(){ 
    	return queryFactory 
        .select(member) 
        .from(member) 
        .where(member.team.id.eq(1L)) 
        .fetch(); 
    } 

/* ============================ */ 
@SpringBootTest 
class MemberRepositorySupportTest { 	
	@Autowired 
    private MemberRepositorySupport memberRepositorySupport; 
    
    @Test 
    void 조인(){ 
    	List memberJoin = memberRepositorySupport.findMemberJoin(); 
        for(Member member : memberJoin){ 
        	System.out.println(member.getName()); 
        } 
    } 
} 

/* ============================ */ 
/* // 결과 test1 test2 */

 세타 조인

  • 비교 연산자를 사용해 두 릴레이션의 속성 값에 맞는 모든 튜플을 연결한 새로운 튜플로 결과 릴레이션을 반환한다.
    => 연관 관계가 없는 필드로 조인한다.
    => 조인하는 테이블의 모든 행의 갯수만큼 반환된다. from 절에 테이블을 나열한다.
``` java 
@Repository
public class MemberRepositorySupport extends QuerydslRepositorySupport {


// team 아이디가 1번인 회원 리스트 출력
public List<Member> findMemberJoin(){
    return queryFactory
            .select(member)
            .from(member)
            .where(member.team.id.eq(1L))
            .fetch();
}
// thetajoin
public List<Member> findMemberThetaJoin(){
    return queryFactory
            .select(member)
            .from(member,team)
            .fetch();
}
}
/* ============================ */
@SpringBootTest
class MemberRepositorySupportTest {

    @Autowired
    private MemberRepositorySupport memberRepositorySupport;
@Test
void 세타조인(){
    List<Member> memberThetaJoin = memberRepositorySupport.findMemberThetaJoin();

    for(Member thetaMember : memberThetaJoin){
        System.out.println("MemberName : " + thetaMember.getName() + " / TeamName : " + thetaMember.getTeam().getName());
    }
}
}

/* ============================ */
/*
// 결과
MemberName : test1 / TeamName : team1
MemberName : test1 / TeamName : team1
MemberName : test2 / TeamName : team1
MemberName : test2 / TeamName : team1
MemberName : test3 / TeamName : team2
MemberName : test3 / TeamName : team2
*/

조인 on 절

  • 조인대상 필터링
@Repository 
public class MemberRepositorySupport extends QuerydslRepositorySupport { 
	public List<Member> findMemberJoinWithOn(){ 
    	return queryFactory 
        	.select(member) 
            .from(member) 
            .leftJoin(team).on(member.team.id.eq(team.id)) 
            .where(team.id.eq(1L)) 
            .fetch(); 
        } 
}
/* ============================ */
@SpringBootTest
class MemberRepositorySupportTest {
	@Autowired 
    private MemberRepositorySupport memberRepositorySupport;
    
    @Test
	void on_사용(){
		List memberJoinWithOn = memberRepositorySupport.findMemberJoinWithOn();
        
        for(Member onMember : memberJoinWithOn){
    		System.out.println(onMember.getName());
		}
    }
  }
/* ============================ */
/*
// 결과
test1
test2
*/

조인 페치 조인

  • SQL 조인을 활용해서 연관된 엔티티를 SQL을 한번에 조회하는 기능  (SQL에서 지원하는 기능은 아니다.)
  • 주로 성능 최적화에 사용된다.
  • 연관된 엔티티를 쿼리 한번으로 모두 가져오는 방법 (FetchType.EAGER와 같은 동작)
    • FetchType.EAGER와 차이
              - EAGER 사용시 해당 연관관계에서 발생하는 모든 쿼리에서 연관관계 데이터도 모두 가져온다.
              - 특정 상황에서만 한 번에 데이터를 가져오고 싶을 때는 fetchJoin()을 사용하는 것이 좋다.
              - N+1문제를 fetchJoin으로 해결할 수 있다.
``` java
@Repository
public class MemberRepositorySupport extends QuerydslRepositorySupport {
// fetch join 사용
public List<Member> findMemberFetchJoin(){
    return queryFactory
            .selectFrom(member)
            .join(member.team, team).fetchJoin()
            .where(member.team.id.eq(2L))
            .fetch();
}

}

/* ============================ */
@SpringBootTest
class MemberRepositorySupportTest {

    @Autowired
    private MemberRepositorySupport memberRepositorySupport;

@Test
void fetchJoin(){
    List<Member> memberFetchJoin = memberRepositorySupport.findMemberFetchJoin();


    for(Member member : memberFetchJoin){
        System.out.println(member.getName());
    }
}

}

/* ============================ */
/*
// 결과
test3
*/

참고

쿠팡으로 연결 클릭

 

제주삼다수 그린

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

반응형

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

Query DSL 시작하기  (0) 2022.12.12
Query DSL - Dynamic Query  (0) 2022.07.06
Query DSL - Paging  (0) 2022.07.06
Query DSL - CASE  (0) 2022.07.05
Query DSL - Subquery  (0) 2022.07.05