W projekcie internetowym, używając najnowszych danych wiosennych (1.10.2) z bazą danych MySQL 5.6, próbuję użyć natywnego zapytania z paginacją, ale doświadczam org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodExceptionproblemu podczas uruchamiania.
AKTUALIZACJA : 20180306 Ten problem został już rozwiązany w wersji Spring 2.0.4. Osoby, które nadal są zainteresowane lub mają problemy ze starszymi wersjami, powinny sprawdzić powiązane odpowiedzi i komentarze dotyczące obejścia.
Zgodnie z przykładem 50 przy użyciu @Query z dokumentacji danych wiosennych możliwe jest określenie samego zapytania i countQuery, na przykład:
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);
}
Z ciekawości, w NativeJpaQueryklasie widzę, że zawiera następujący kod do sprawdzenia, czy jest to prawidłowe zapytanie 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);
}
}
Moje zapytanie zawiera Pageableparametr, więc hasPagingOrSortingParameterjest true, ale szuka również sekwencji #pageablelub #sortwewnątrz elementu queryString, czego nie dostarczam.
Próbowałem dodać #pageable(to komentarz) na końcu mojego zapytania, co powoduje, że walidacja jest zakończona, ale kończy się niepowodzeniem podczas wykonywania, mówiąc, że zapytanie oczekuje jednego dodatkowego parametru: 3 zamiast 2.
Zabawne jest to, że jeśli ręcznie zmienię containsPageableOrSortInQueryExpressionz falsena truepodczas pracy, zapytanie działa dobrze, więc nie wiem, dlaczego sprawdza, czy ten ciąg znajduje się na moim, queryStringi nie wiem, jak go podać.
Każda pomoc byłaby bardzo mile widziana.
Aktualizacja 30.01.2018 Wygląda na to, że programiści w projekcie Spring-Data pracują nad rozwiązaniem tego problemu za pomocą PR Jensa Schaudera