본문 바로가기

QueryDsl

Querydsl join문 기본문법

728x90

조인 -기본 조인

 

-> Querydsl에서는 JOIN 함수도 역시 제공한다.

 

join(), innerJoin():  내부조인(inner join)

leftJoin(): left외부조인(left outer join)

rightJoin():right외부조인(right outer join)

JPQL의 on과 성능 최적화를 위한 fetch 조인제공

 

그렇다면 연관관계가 없는 엔티티간의 조인은 어떻게 하는가? → 세타 조인

 

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

    List<Member> result = queryFactory
            .select(member)
            .from(member, team)
            .where(member.username.eq(team.name))
            .fetch();

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

from 절에서는 여러 엔티티를 선택해서 세터조인이 가능하다.

전혀 연관관계 없는 필드로도 조인이 가능하다.

외부조인이 불가능한데 on절을 사용해서 외부조인이 가능하다.

 

패치조인 적용하는방법

 

@Test
public void fetchJoin() throws Exception{

    em.flush();
    em.clear();

    Member findMember = queryFactory
            .selectFrom(member)
            .join(member.team,team).fetchJoin()
            .where(member.username.eq("member1"))
            .fetchOne();

    boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());

    Assertions.assertThat(loaded).as("패치 조인 적용").isTrue();

}
728x90

'QueryDsl' 카테고리의 다른 글

JPQL 과 QueryDsl  (0) 2023.03.20
querydsl 벌크연산 수행 주위사항  (0) 2023.01.23
Query dsl 설정 및 테스트  (0) 2023.01.13