• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

페이징 했을때 발생하는 문제

22.10.14 03:46 작성 조회수 312

2

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
안녕하세여 영한님 강의 너무 잘 보고있습니다.

다름이 아니라 JPA 관련 강의를 모두 듣고 사이드 프로젝트에JPA를 적용하던 중에 문제가 발생하여 질문드립니다.

문제 상황

현재 Issue 라는 엔티티가 member와 milestone이라는 엔티티와 @ManyToOne 관계를 맺고 있는 와중에 Issue의 상태에 따라 Issue를 조회 하는 로직을 만들고 있었습니다.

문제 코드

@Query(value = "select i from Issue i left join fetch i.member m left join fetch i.milestone mi where i.status = :status")
Page<Issue> findIssues(Pageable pageable, @Param("status") IssueStatus status);

위에 코드가 상태에 따라 Issue를 조회 하는 코드인데, 우선 N+1 문제를 해결하기 위해 left join fetch 를 사용하고 Issue의 상태에 따른 조회를 위해 where 문을 사용하였습니다. 작성한 코드가 크게 문제가 있다 생각하지 않았는데 막상 실행을 해보니 query specified join fetching, but the owner of the fetched association was not present in the select list 라는 문구의 예외가 발생하였습니다.

다행히 구글에 검색하여
https://stackoverflow.com/questions/12459779/query-specified-join-fetching-but-the-owner-of-the-fetched-association-was-not

해당 글을 보고 따로 count query를 작성하여 해결을 하긴 했는데, 왜 여기서 따로 count query를 작성해야 하는지 의문이 들었습니다. 페이징을 하면 count query를 알아서 날려주는 것으로 생각했는데 여기서는 왜 그렇게 동작하지 않는걸까요??

해결 코드

@Query(value = "select i from Issue i left join fetch i.member m left join fetch i.milestone mi where i.status = :status",
            countQuery = "select count(i) from Issue i left join i.member left join i.milestone where i.status = :status")
Page<Issue> findIssues(Pageable pageable, @Param("status") IssueStatus status);

답변 1

답변을 작성해보세요.

3

David님의 프로필

David

2022.10.14

안녕하세요. crispin님, 공식 서포터즈 David입니다.

아래 글 답변을 참고해주세요.

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

감사합니다.

crispin님의 프로필

crispin

질문자

2022.10.14

답변 정말 감사드립니다. 제가 좀더 찾아보고 질문들 남겼어야 했는데 죄송합니다.