QueryDsl로 페이지네이션을 처리하는데 문제가 발생했다.
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.query.SemanticException: Could not interpret path expression '특정엔티티.completedSurveyWeek'
특정엔티티의 completedSurveyWeek를 못찾겠다고 한다.
위의 값을 사용하는 부분은 where 절에 들어가는 BooleanExpression?
인데,
private fun statusEq(status: Status): BooleanExpression? =
when (status) {
1 -> 특정엔티티.completedSurveyWeek.isNull
2 -> 특정엔티티.completedSurveyWeek.eq(숫자)
3 -> 특정엔티티.completedSurveyWeek.ne(숫자)
4 -> null
}
대충 위와 같이 구성돼있다. (1,2,3,4 모두 임의의 값이다)
status = 4로 요청할 경우 null로 page를 잘 불러오는데, 1/2/3 을 요청하는 경우 응답을 불러오지 못하는 것이다.
실행되는 sql을 datagrip에서 직접 실행해봐도 잘 돌아가는데 뭐가 문제였을까?
정답은 페이지네이션의 응답값을 return PageImpl(content, pageable, countQuery)
와 같이 응답하는데,
1. content에 들어가는 페이지는 a 라는 테이블에 b,c 라는 테이블을 left join했고
2. countQuery에서 날린 쿼리에는 a 라는 테이블의 count만 구할 뿐 b,c라는 테이블은 join하지 않고 b테이블의 컬럼이 조건으로 들어있는 statusEq()
를 where절에 넣어놨던 것이다.
출처