웹 프로젝트에서 MySQL 5.6 데이터베이스와 함께 최신 스프링 데이터 (1.10.2)를 사용하여 페이지 매김과 함께 네이티브 쿼리를 사용하려고하지만 org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
시작할 때 발생합니다.
업데이트 : 20180306이 문제는 이제 Spring 2.0.4 에서 수정되었습니다. 여전히 이전 버전에 관심이 있거나 이전 버전을 사용하는 경우 관련 답변과 주석에서 해결 방법을 확인하십시오.
Spring-data 문서에서 @Query 사용의 Example 50에 따르면 다음 과 같이 쿼리 자체와 countQuery를 지정할 수 있습니다.
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
호기심으로 NativeJpaQuery
수업 중에 유효한 jpa 쿼리인지 확인하는 다음 코드가 포함되어 있음을 알 수 있습니다.
public NativeJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, EvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) {
super(method, em, queryString, evaluationContextProvider, parser);
JpaParameters parameters = method.getParameters();
boolean hasPagingOrSortingParameter = parameters.hasPageableParameter() || parameters.hasSortParameter();
boolean containsPageableOrSortInQueryExpression = queryString.contains("#pageable") || queryString.contains("#sort");
if(hasPagingOrSortingParameter && !containsPageableOrSortInQueryExpression) {
throw new InvalidJpaQueryMethodException("Cannot use native queries with dynamic sorting and/or pagination in method " + method);
}
}
내 쿼리에는 Pageable
매개 변수 가 포함되어 있으므로 hasPagingOrSortingParameter
도 true
있지만 제공하지 않는 에서 #pageable
또는 #sort
시퀀스를 찾고 queryString
있습니다.
#pageable
쿼리 끝에 (주석)을 추가하여 유효성 검사를 통과했지만 쿼리에 2 대신 3이라는 추가 매개 변수가 필요하다는 메시지가 실행에 실패합니다.
재미있는 점은 실행 중에 수동으로 containsPageableOrSortInQueryExpression
에서 false
로 변경 true
하면 쿼리가 제대로 작동하므로 해당 문자열이 내 위치에 있는지 확인하는 이유를 queryString
모르고 제공하는 방법을 모릅니다.
어떤 도움이라도 대단히 감사하겠습니다.
2018 년 1 월 30 일 업데이트 Spring-Data 프로젝트의 개발자 가 Jens Schauder 의 PR 을 통해이 문제에 대한 수정 작업을하고있는 것 같습니다.