작성
·
1.2K
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
안녕하세요. 현집님
스프링 데이터 JPA에서 fetch join이 들어간 경우 Count 쿼리를 정상적으로 만들어내지 못합니다.
@EntityGraph를 사용하는 경우에는 Count 쿼리를 정상적으로 만들어낼 수 있습니다.
따라서 이 경우 countQuery 부분을 별도로 분리해주시면 됩니다.
조인 대상을 필터링하는 경우에도 countQuery를 똑같이 사용해주시면 됩니다.
관련해서 다음 링크를 참고해주세요^^
https://stackoverflow.com/questions/21549480/spring-data-fetch-join-with-paging-is-not-working
감사합니다.
1