inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

조인 - 페치 조인

페치조인 관련해서 질문있습

297

dionisos198

작성한 질문수 42

0

@Test
    public void fetchJoinNo() throws Exception{
        em.flush();
        em.clear();

        /*Member findMember = queryFactory
                .selectFrom(member)
                .where(member.username.eq("member1"))
                .fetchOne();*/

        Tuple tuple= queryFactory
                .select(member,team)
                .from(member)
                .where(member.username.eq("member1"))
                .fetchOne();

        String qlString= "select m,m.team from Member m where m.username=:username";

        Tuple tuple1 = (Tuple) em.createQuery(qlString, Tuple.class).setParameter("username","member1")
                .getResultList();





        boolean loaded = emf.getPersistenceUnitUtil().isLoaded(tuple.get(team));

        assertThat(loaded).as("페치 조인 적용").isTrue();
    }

 

위 코드는 위 코드에서 tuple 을 이용해서 ,member 와 team 을 함꼐 조회해 보았을 때 team 이 영속화 되는지 실험한 것입니다.

아래 코드입니다.

queryFactory
                .select(member,team)
                .from(member)
                .where(member.username.eq("member1"))
                .fetchOne();

 

원래 fetchJoin() 을 안붙여서 안될 것이라고 생각했습니다만 의외로 되가지고 뭐지 ? 했습니다.

 

원래 되는 것인가요??

 

 

그러면 원래 이게 의미하는 JPQL 인

select
        member1,
        team 
    from
        Member member1 
    where
        member1.username = ?1

 

를 직접 작성하면

 

@Query("select m, m.team from Member m wherer m.username=:username)

뭐 이런식으로 해도 fetch join 이 된다는 얘기 아닌가요?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

java jpa

답변 2

0

김영한

안녕하세요. dionisos198님

다음을 참고해주세요.

https://www.inflearn.com/questions/33719

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 대한 답변은 아래와 같습니다.

JPQL을 사용해서 쿼리를 작성할 때 페치 조인(fetch join)은 명시적으로 사용해야 합니다. 페치 조인을 사용하지 않는 경우, 연관된 엔티티는 지연 로딩(LAZY) 전략에 따라 로드되거나, 즉시 로딩(EAGER) 전략에 설정되어 있다면 같이 로드됩니다. 그러나 이 경우에는 페치 조인과는 다릅니다.

페치 조인을 사용하려면 JPQL에서 join fetch 구문을 사용해야 합니다. 예를 들어, Member 엔티티와 연관된 Team 엔티티를 페치 조인으로 가져오려면 다음과 같이 쿼리를 작성해야 합니다.

select m from Member m join fetch m.team where m.username = :username

페치 조인을 사용할 경우, 연관된 엔티티는 주 쿼리 실행 시 함께 로드되며, 결과적으로 N+1 문제를 방지할 수 있습니다. 데이터를 한 번의 쿼리로 가져오기 때문에 성능이 개선되는 장점이 있습니다.

따라서, 코드 예제에서 fetchOne()을 사용하여 MemberTeam을 함께 조회했지만, 명시적으로 페치 조인을 사용하지 않았다면, 이는 페치 조인이 적용된 것이 아니라 연관된 엔티티가 다른 방식(예: 즉시 로딩)으로 로드된 것일 수 있습니다.

즉, 정확한 페치 조인의 적용 여부를 확인하려면 join fetch@EntityGraph 등을 통해 명시적으로 페치 조인을 선언해야 합니다.

SpringBoot 4.X에서의 Querydsl 설정

0

88

2

querydsl 오픈소스에 대한 질문

0

72

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

109

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

317

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

70

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

160

1

querydsl sum() 메서드 없어요.

0

159

2

build 디렉터리 생성

0

136

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

114

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

91

1

오타 제보 드립니다.

0

72

2

벌크 연산과 flush, clear

0

76

1

Run As Intellij 로 변경시 Q타입 import 불가

0

88

1

QHello import하기 문제 발생

0

147

2

등록된 함수 보는법(H2Dialect) 질문

0

68

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

196

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

200

1

querydsl 설정 문제

0

222

2

quey dsl 설정부분

0

158

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

89

2

(OrderSpecifier)관련 내용 어디있을가요

0

65

1

중급문법 벌크연산에서

0

81

2