2017-12-06 2 views
0

Ich habe eine Java-Spring-Boot-Anwendung, die Hibernate als ORM verwenden. Die Datenbank ist ein Azure SQL Server.Spring Boot + Hibernate + SqlAzure Paginierung Ausgabe

Ich habe die SetShowSql auf Anbieter-Adapter-Konfiguration aktiviert.

Wenn ich Objekte finden möchte, habe ich die Methoden setFirstResult und setMaxResults von TypedQuery verwendet und dann die Methode getResultList aufgerufen.

Die in der Konsole ausgedruckte Abfrage enthält die OFFSET- und ROW FETCH-Klauseln nicht und es scheint, dass Hibernate zuerst alle Ergebnisse abruft und dann die Seitennumerierung auf die Ergebnisliste anwendet.

Dies verursacht offensichtlich Leistungsprobleme.

Wo mache ich mich falsch?

Im Folgenden berichte ich den Beispielcode, den ich verwendet habe.

query.setFirstResult(pageable.getOffset()); 
query.setMaxResults(pageable.getPageSize()); 
... 
query.getResultList() 
+0

Welchen Dialekt verwenden Sie? Enthält Ihre Abfrage auch ein 'ORDER BY'-Fragment oder sind die Ergebnisse ungeordnet? – Naros

+0

Ich habe mit allen Dialekt versucht. Der tatsächliche Dialekt, den ich verwende, ist org.hibernate.dialect.SQLServerDialect. Bezüglich des ordeer by fragment, ja, ich habe es eingefügt und sehe es auf einer gedruckten Abfrage. Heute habe ich die neueste stabile Version von Hibernate ausprobiert, aber das Ergebnis ist das gleiche. –

Antwort

0

Das einzige Mal, Hibernate wird explizit schließt den OFFSET und FETCH Klauseln unter einem SQL Server Dialekt werden, wenn folgende Bedingungen erfüllt sind:

  1. Sie org.hibernate.dialect.SQLServer2012Dialect oder jede zukünftige 2012+ Version verwenden.
  2. Ihre Anfrage muss eine ORDER BY Klausel enthalten.
  3. Ihre Abfrage führt keine TOP Klauselabfrage aus.

Die SQLServer2012Dialect verwendet eine angepasste LimitHandler Implementierung genannt SQLServer2012LimitHandler, die Sie here, die explizit behandelt diesen Anwendungsfall oder sonst fällt zurück auf das alte Verhalten sehen.

Wenn beide obigen Anforderungen erfüllt sind, aber die Logik aus irgendeinem Grund immer noch auf das alte Verhalten zurückfällt, dann ist es ein Fehler. In diesem Fall sollten Sie wahrscheinlich HHH-12152 mit einem Testfall aktualisieren, damit wir es beheben können.

+0

Danke !! Mein Problem war in der Spring-Konfiguration. Wenn ich die Eigenschaft hibernate.version auf 5.2.12.Final setze funktioniert es gut! –

Verwandte Themen