У веб-проекті, використовуючи найновіші дані spring (1.10.2) з базою даних MySQL 5.6, я намагаюся використовувати власний запит з пагінацією, але org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
під час запуску я відчуваю .
ОНОВЛЕННЯ : 20180306 Цю проблему тепер вирішено навесні 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 від Йенса Шаудера