[JPA] Reason: Count query validation failed

문정현·2023년 11월 24일
0
post-thumbnail

@Query 어노테이션과 Fetch Join으로 성공적으로 조회 기능을 개발한 기쁨도 잠시 게시글 목록을 조회하는 것이니만큼 게시글이 많아졌을때 모든 게시글을 원큐에 주는건 바람직하지 않다고 생각했다.

그래서 Pageable을 통해 client로부터 얼마나 게시글을 response해줄지에 대한 기능을 개발하려고 했다

바로 폭풍 구글링

public Page<User> getAllUserWithPageByQueryMethod(@RequestParam("page") Integer page, @RequestParam("size") Integer size) {
        PageRequest pageRequest = PageRequest.of(page, size);
        return userRepository.findByAddress("Korea", pageRequest);
    }

public interface UserRepository extends JpaRepository<User, Long> {
    Page<User> findByAddress(String address, Pageable pageable);
}

추가로 Page<?> 로 받아온것 List<>로 변환할 때는 .getContent()로 받으면 되기에 여기까지만 해도 금방 할 줄 알았다,,

Reason: Count query validation failed

이전 포스트에서 열심히 만든 @Query친구에게 Pageable을 달아주면

  @Query(
      "select b from Board b join fetch b.user u where u in " +
          "(select f.follower from Follow f where f.following.userId = :userId)"
  )
  Page<Board> findAllUserFollowerBoard(@Param("userId") Long userId, Pageable pageable);

이렇게 추가해주고 실행해보자 어서

이런 에러를 마주할텐데 뒤로 쭉쭉 가서 찾아보면
Reason: Count query validation failed for method 이런 세부 에러 정보를 찾아 볼 수 있다.

이 경우 스택 오버플로우에 검색하보면 nativeQuery = true를 통해 Native Query를 적용하고 countQuery = xxx 와 같이 따로 적어주는 방법으로 안내하고 있는데 쿼리문이 너무 지저분해 지는거 같아 다른 방법을 찾아보았다.

Alternatively in newest versions of Spring (supporting JPA 2.1 specification) you can use entity graph like this:

@EntityGraph(attributePaths = "roles")
@Query("FROM User user")
Page<User> findAllWithRoles(Pageable pageable);

Piotr Tempes씨가 정확히 내가 원하는 간결한 코드 그리고 최신기술! (2018년 기준..ㅋㅋ)

이제 내 코드를 수정해보자

  @EntityGraph(attributePaths = "user")
  @Query(
      "select b from Board b where b.user in " +
          "(select f.follower from Follow f where f.following.userId = :userId)"
  )
  Page<Board> findAllUserFollowerBoard(@Param("userId") Long userId, Pageable pageable);

EntityGraph attributePaths 매핑을 통해 entity join을 해주기 때문에 join fetch부분을 지워주고 pageable을 파라미터 받아보면...


이전에는 3개가 있어서 다 가져왔는데 page=0 size=2 첫 페이지의 2개까지 가져온 모습이다 (pageable에서는 0을 첫번째 페이지로 둔다)

profile
주니어 개발자

0개의 댓글