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.InvalidJpaQueryMethodExceptionbeim 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 NativeJpaQueryich 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 PageableParameter, so hasPagingOrSortingParameterist true, aber es ist auch für eine Suche #pageableoder #sortSequenz innerhalb der queryString, die ich nicht bieten.
Ich habe versucht, #pageableam 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 containsPageableOrSortInQueryExpressionvon falsezu wechsle true, einwandfrei funktioniert, sodass ich nicht weiß, warum diese Zeichenfolge bei mir überprüft wird queryStringund 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