(작성중) 도무지 알 수 없는 JPQL 파라미터 바인딩 에러

규바·2024년 11월 11일
1

트러블슈팅

목록 보기
2/7

트러블 슈팅 작성중 ...

parameter binding 안됨

지역코드와 정렬타입을 parameter로 course 목록을 가져오는 코드.
(버전화해서 기록할 목적으로 querydsl을 쓰지않았고, 분리하지도 않았음)
:regionCode는 잘 바인딩되지만 orderType은 바인딩 되지 않았다.
함수의 매개변수로 제대로 넘어오고 있는 것은 확실했다.

    @Query("SELECT c FROM Course c " +
            "LEFT JOIN CourseProgress cp ON c.id = cp.course.id " +
            "WHERE (:regionCode IS NULL OR c.regionId = :regionCode) " +
            "GROUP BY c " +
            "ORDER BY " +
            "CASE WHEN :orderType = 'LATEST' THEN c.createdAt " +
            "     WHEN :orderType = 'POPULAR' THEN COUNT(cp.id) " +
            "END DESC")
    Page<Course> findAllCourseByCondition(
            @Param("regionCode") Integer regionCode,
            @Param("orderType") String orderType,
            Pageable pageable
    );

java.lang.IllegalArgumentException: No parameter named ':orderType' in query with named parameters [regionCode] 발생

'orderType'이 바인딩 되지않음.
똥꼬쇼 스타트.

어쩌다 된 코드

orderType가 제대로 바인딩 되는지 확인하려고 WHERE절에 무의미하게 적었다.
그런데 where절에서 제대로 바인딩되는 것은 물론이고, ORDER BY 뒤 CASE WHEN에서도 제대로 바인딩 되었다.

    @Query("SELECT c FROM Course c " +
            "LEFT JOIN CourseProgress cp ON c.id = cp.course.id " +
            "WHERE (:regionCode IS NULL OR c.regionId = :regionCode ) " +
            "AND :orderType = :orderType "
            "GROUP BY c " +
            "ORDER BY " +
            "CASE WHEN :orderType = 'LATEST' THEN c.createdAt " +
            "     WHEN :orderType = 'POPULAR' THEN COUNT(cp.id) " +
            "END DESC")
    Page<Course> findAllCourseByCondition(
            @Param("regionCode") Integer regionCode,
            @Param("orderType") String orderType,
            Pageable pageable
    );

왜 될까?

작성 중 ...

https://forum.cuba-platform.com/t/jpql-order-by-clause-with-case-when-ignored/9342

profile
그때그때 학습하고 있는 내용을 올려요

0개의 댓글