인프런 커뮤니티 질문&답변

현집님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

스프링 데이터 JPA 페이징과 정렬

페이징 질문

21.03.08 21:02 작성

·

1.1K

3

안녕하세요 선생님!

강의를 듣다가 궁금한게 생겨 몇 가지 질문드립니다.

1. @Query를 이용해서 jpql 페치조인을 한 경우, 페이징을 하려할때 다음과 같은 에러가 뜹니다. 

@Query("select m from Member m join fetch m.team")
Page<Member> findFetchJoinTeam(Pageable pageable);
@Test
void member(){

Team teamA = teamRepository.save(new Team("teamA"));
memberRepository.save(new Member("member1", 40, teamA));
memberRepository.save(new Member("member2", 40, teamA));
memberRepository.save(new Member("member3", 40, teamA));

PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC,
"username"));

Page<Member> fetchJoinTeam = memberRepository.findFetchJoinTeam(pageRequest);

}

Failed to load ApplicationContext

java.lang.IllegalStateException: Failed to load ApplicationContext

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberRepository' defined in com.example.forq.MemberRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page com.example.forq.MemberRepository.findFetchJoinTeam(org.springframework.data.domain.Pageable)!

paging에서 count 부분이 문제인것 같은데  entitygraph로 하면 잘 돼서 제가 뭔가를 놓친건지 궁금합니다

public interface MemberRepository extends JpaRepository<Member, Long> {

@Override
@EntityGraph(attributePaths = {"team"})
Page<Member> findAll(Pageable pageable);

}

2. where 등으로 필터링을 하지 않을떄는 countQuery를 분리해서 최적화를 하면된다고 하셨는데

만약 

select m from Member m join m.team t where t.name=:name ”같이 조인 대상에 필터링을 하는 경우에는 어떻게 최적화를 할 수 있는지 궁금합니다.

감사합니다!

답변 2

3

김영한님의 프로필 이미지
김영한
지식공유자

2021. 03. 10. 09:21

안녕하세요. 현집님

스프링 데이터 JPA에서 fetch join이 들어간 경우 Count 쿼리를 정상적으로 만들어내지 못합니다.

@EntityGraph를 사용하는 경우에는 Count 쿼리를 정상적으로 만들어낼 수 있습니다.

따라서 이 경우 countQuery 부분을 별도로 분리해주시면 됩니다.

조인 대상을 필터링하는 경우에도 countQuery를 똑같이 사용해주시면 됩니다.

관련해서 다음 링크를 참고해주세요^^

https://stackoverflow.com/questions/21549480/spring-data-fetch-join-with-paging-is-not-working

감사합니다.

1

현집님의 프로필 이미지
현집
질문자

2021. 03. 13. 23:39

감사합니다!!

현집님의 프로필 이미지

작성한 질문수

질문하기