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