In einem Webprojekt, das die neuesten Spring-Daten (1.10.2) mit einer MySQL 5.6-Datenbank verwendet, versuche ich, eine native Abfrage mit Paginierung zu verwenden, aber org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
beim Start tritt eine auf.
UPDATE : 20180306 Dieses Problem wurde jetzt in Spring 2.0.4 behoben. Für diejenigen, die noch interessiert sind oder mit älteren Versionen nicht weiterkommen, überprüfen Sie die entsprechenden Antworten und Kommentare auf Problemumgehungen.
Gemäß Beispiel 50 unter Verwenden von @Query aus der Spring-Data-Dokumentation ist dies möglich, indem die Abfrage selbst und eine countQuery wie folgt angegeben werden:
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);
}
Aus Neugier kann NativeJpaQuery
ich in der Klasse sehen, dass es den folgenden Code enthält, um zu überprüfen, ob es sich um eine gültige jpa-Abfrage handelt:
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);
}
}
Meine Abfrage enthält einen Pageable
Parameter, so hasPagingOrSortingParameter
ist true
, aber es ist auch für eine Suche #pageable
oder #sort
Sequenz innerhalb der queryString
, die ich nicht bieten.
Ich habe versucht, #pageable
am Ende meiner Abfrage etwas hinzuzufügen (es ist ein Kommentar), wodurch die Validierung bestanden wird. Bei der Ausführung schlägt jedoch fehl, dass die Abfrage einen zusätzlichen Parameter erwartet: 3 anstelle von 2.
Das Komische ist, dass die Abfrage , wenn ich während der Ausführung manuell containsPageableOrSortInQueryExpression
von false
zu wechsle true
, einwandfrei funktioniert, sodass ich nicht weiß, warum diese Zeichenfolge bei mir überprüft wird queryString
und ich nicht weiß, wie ich sie bereitstellen soll.
Jede Hilfe wäre sehr dankbar.
Update 30.01.2008 Es scheint, dass Entwickler des Spring-Data-Projekts mit einer PR von Jens Schauder an einer Lösung für dieses Problem arbeiten