В веб-проекте, используя последние данные о Spring (1.10.2) с базой данных MySQL 5.6, я пытаюсь использовать собственный запрос с разбиением на страницы, но я испытываю org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
при запуске.
ОБНОВЛЕНИЕ: 20180306 Эта проблема теперь исправлена в Spring 2.0.4. Для тех, кто все еще заинтересован или застрял в старых версиях, проверьте соответствующие ответы и комментарии для обходных путей.
В соответствии с примером 50 в разделе "Использование @Query" из документации по данным о Spring это возможно с указанием самого запроса и 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
(это комментарий) в конце моего запроса, что делает проверку #pageable
но затем происходит сбой при выполнении, говоря, что запрос ожидает один дополнительный параметр: 3 вместо 2.
Забавно то, что, если я вручную изменяю containsPageableOrSortInQueryExpression
с false
на true
во время выполнения, запрос работает нормально, поэтому я не знаю, почему он проверяет наличие этой строки в моем queryString
и я не знаю, как ее предоставить.
Любая помощь приветствуется.
Обновление от 30.01.2008 Похоже, что разработчики проекта spring-data работают над исправлением этой проблемы с пиаром Jens Schauder.