2016-03-23 15 views
0

Ich möchte fragen, ob Kriterien setFirstResult und setMaxResults mit dem Auftrag stören kann ich anwenden werde, bevor beide Methoden verwenden. Ich habe bemerkt, dass, wenn addingOrder auf Feld, die Ergebnisse, wenn Wiederholungen von diesem Feld nach ID der Datensätze sortiert sind. Wenn ich setFirstResult, setMaxResults auf Kriterien nach der Bestellung anwenden, werden die gleichen Ergebnisse nach ihrer Speicherung sortiert.Hibernate Criteria - Ordnung und Paginierung

+0

Bitte geben Sie den Code und die relevanten Hibernate-Zuordnungen ein. –

+0

'Order By' wird nur zuletzt angewendet. Also ist das begrenzte Ergebnis geordnet. Dies ist das erwartete Verhalten –

Antwort

0

Die Ergebnisse, wenn eines dieser Felder wiederholt wird nach ID der Datensätze sortiert.

Auf der Grundlage der obigen Aussage, meine Grundannahme/Interpretation ist, dass Sie auf ein Szenario beziehen, wo Sie addOrder auf einem Feld/Spalte anwenden, die mit nicht-eindeutigen Werten/elben Werte (Spalte duplizieren).

Ich versuchte Beispielcode und bemerkte, dass die SQL, die generiert wird, in beiden Fällen identisch ist. (ob addOrder vor oder nach setFirst/MaxResults angegeben ist).

Hibernate: select this_.id as id1_0_0_, this_.name as name2_0_0_, this_.version as version3_0_0_ from SimplePost this_ order by this_.name asc limit ? 

Ich habe bemerkt, dass, wenn addingOrder auf dem Feld, die Ergebnisse, wenn jede von diesem Gebiet wiederholt von ID der Datensätze sortiert sind. Wenn ich setFirstResult, setMaxResults auf Kriterien nach der Bestellung anwenden, werden die gleichen Ergebnisse nach ihrer Speicherung sortiert.

Die beiden oben genannten Erklärung sind garantiert auch nicht, es sei denn, die die Datenbank zugrunde liegenden stellt sicher, dass es die Zeilen, wenn die gleiche Reihenfolge zurückgibt, auch durch nicht eindeutige Spaltenwerte sortiert. Siehe die folgende Ausgabe.

HINWEIS: Ich habe mit Hibernate5 und h2 In-Memory-Datenbank getestet. Und die Reihenfolge der Einsätze ist bei mehreren Durchläufen gleich.

Mit addOrder nach setMaxResults, die Abfrage verwendet:

session1.createCriteria(OrderByPost.class).setFirstResult(0).setMaxResults(3).addOrder(Order.asc("name")).list() 

Ergebnisse:

[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=4, name=Bpost], Post [id=6, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=2, name=Bpost], Post [id=6, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=4, name=Bpost], Post [id=6, name=Bpost]] 

Mit addOrder vor setFirstResult, die Abfrage verwendet:

session1.createCriteria(OrderByPost.class).addOrder(Order.asc("name")).setFirstResult(0).setMaxResults(3).list() 

Ergebnisse:

[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=3, name=Bpost], Post [id=6, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]] 
[Post [id=1, name=Apost], Post [id=6, name=Bpost], Post [id=4, name=Bpost]] 

Ich denke, wenn Sie es einige Male laufen könnten Sie, dass, um sehen nicht einmal gewährleistet, wenn wir die addOrder(..) Methode in Bezug auf setFirst/MaxResults nicht ändern.

Basierend auf den obigen Beobachtungen, glaube ich, wenn wir addOrder auf einem Feld angeben, alle diese Ruhezustand garantiert ist, sind die Ergebnisse nach diesem Feld sortiert.

Und wenn das Feld/Spalte Duplikat/gleiche Werte für einige Reihen haben, geschieht, Hibernate nicht sicher, dass wir für mehrere Ausführungen der Zeilen in der gleichen Reihenfolge werden immer.

Eine Möglichkeit, um sicherzustellen, dass wir die Ergebnisse in der gleichen Reihenfolge jedes Mal erhalten, wenn wir auf dem Feld/Spalte bestellen, die doppelte/gleiche Werte haben kann, ist eine andere addOrder auf einige einzigartige Feld hinzufügen, sagen id wie unten :

session1.createCriteria(OrderByPost.class).setFirstResult(0).setMaxResults(7).addOrder(Order.asc("name")).addOrder(Order.asc("id")).list() 
By the way

, lassen Sie mich wissen, wenn ich meine Grundannahme/Interpretation sich falsch verstanden, was ich nicht hoffen.

Verwandte Themen