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.InvalidJpaQueryMethodException
problemu 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 NativeJpaQuery
klasie 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 Pageable
parametr, więc hasPagingOrSortingParameter
jest true
, ale szuka również sekwencji #pageable
lub #sort
wewną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ę containsPageableOrSortInQueryExpression
z false
na true
podczas pracy, zapytanie działa dobrze, więc nie wiem, dlaczego sprawdza, czy ten ciąg znajduje się na moim, queryString
i 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