Gibt es in Hibernate 3 eine Möglichkeit, das Äquivalent des folgenden MySQL-Limits in HQL zu erreichen?
select * from a_table order by a_table_column desc limit 0, 20;
Ich möchte setMaxResults wenn möglich nicht verwenden. Dies war in der älteren Version von Hibernate / HQL definitiv möglich, scheint aber verschwunden zu sein.
java
hibernate
hql
hibernate3
Strohbraun
quelle
quelle
Hibernate-5.0.12
. Ist das noch nicht verfügbar? Es wäre sehr schwer,setMaxResults
ungefähr eine Million Datensätze zu erhalten und dann den Filter darauf anzuwenden , wie @Rachel in der Antwort von @skaffman bemerkt hat.Antworten:
Dies wurde vor einigen Jahren im Hibernate-Forum veröffentlicht, als gefragt wurde, warum dies in Hibernate 2, aber nicht in Hibernate 3 funktioniert:
Wenn es also in Hibernate 2 funktioniert hat, scheint dies eher zufällig als beabsichtigt zu sein. Ich denke, das lag daran, dass der Hibernate 2-HQL-Parser die Bits der Abfrage, die er als HQL erkannte, ersetzen und den Rest so lassen würde, wie er war, damit Sie sich in natives SQL einschleichen können. Hibernate 3 hat jedoch einen richtigen AST-HQL-Parser und ist viel weniger verzeihend.
Ich denke
Query.setMaxResults()
wirklich ist deine einzige Option.quelle
setMaxResults
Ergebnismenge eine begrenzte Anzahl von Ergebniszeilen aus der Ergebnismenge entnommen und dem Benutzer angezeigt. In meinem Fall habe ich 3 Millionen Datensätze, die abgefragt werden, und rufe dann setMaxResults auf, um sie festzulegen 50 Datensätze, aber ich möchte das nicht tun, während ich selbst 50 Datensätze abfragen möchte, gibt es eine Möglichkeit, das zu tun?setMaxResults
Hibernate hängt denlimit
Teil an die Abfrage an. Es werden nicht alle Ergebnisse angezeigt. Sie können die Abfrage überprüfen, die es erzeugt, indem Sie aktivieren:<property name="show_sql">true</property>
quelle
setFirstResult
es in dieser Antwort tatsächlich erwähnt wird, während hier und anderswo nursetMaxResults
dies undsetMaxResults
das gesagt wird , ohne zu erwähnen, wie der Offset eingestellt werden soll.Wenn Sie
setMaxResults()
dasQuery
Objekt nicht verwenden möchten, können Sie jederzeit wieder normales SQL verwenden.quelle
Wenn Sie setMaxResults nicht verwenden möchten, können Sie auch Query.scroll anstelle von list verwenden und die gewünschten Zeilen abrufen. Nützlich zum Beispiel zum Blättern.
quelle
setMaxResults()
zuerst jeder Datensatz im Speicher geladen und dann eine Unterliste erstellt wird. Wenn hunderttausende oder mehr Datensätze vorhanden sind, stürzt der Server ab, weil nicht genügend Speicher vorhanden ist. Ich könnte jedoch von einer JPA-typisierten Abfrage zu einer Hibernate-Abfrage übergehenQueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
und dann diescroll()
von Ihnen vorgeschlagene Methode verwenden.Sie können hierfür leicht die Paginierung verwenden.
Sie müssen übergeben
new PageRequest(0, 1)
, um Datensätze abzurufen, und aus der Liste den ersten Datensatz abrufen.quelle
Die
setFirstResult
undsetMaxResults
Query
MethodenFür eine JPA und Ruhezustand
Query
, dassetFirstResult
ist das Äquivalent von VerfahrenOFFSET
und dassetMaxResults
Verfahren ist das Äquivalent von LIMIT:Die
LimitHandler
AbstraktionDer Ruhezustand
LimitHandler
definiert die datenbankspezifische Paginierungslogik. Wie das folgende Diagramm zeigt, unterstützt der Ruhezustand viele datenbankspezifische Paginierungsoptionen:Abhängig vom zugrunde liegenden relationalen Datenbanksystem, das Sie verwenden, verwendet die obige JPQL-Abfrage nun die richtige Paginierungssyntax.
MySQL
PostgreSQL
SQL Server
Orakel
Der Vorteil von
setFirstResult
undsetMaxResults
besteht darin, dass Hibernate die datenbankspezifische Paginierungssyntax für alle unterstützten relationalen Datenbanken generieren kann.Sie sind nicht nur auf JPQL-Abfragen beschränkt. Sie können die
setFirstResult
undsetMaxResults
-Methode sieben für native SQL-Abfragen verwenden.Native SQL-Abfragen
Sie müssen die datenbankspezifische Paginierung nicht fest codieren, wenn Sie native SQL-Abfragen verwenden. Der Ruhezustand kann dies zu Ihren Abfragen hinzufügen.
Wenn Sie diese SQL-Abfrage unter PostgreSQL ausführen:
Der Ruhezustand wird es wie folgt transformieren:
Cool, oder?
Jenseits der SQL-basierten Paginierung
Die Paginierung ist gut, wenn Sie die Filter- und Sortierkriterien indizieren können. Wenn Ihre Paginierungsanforderungen eine dynamische Filterung implizieren, ist es viel besser, eine Lösung mit invertiertem Index wie ElasticSearch zu verwenden.
Weitere Informationen finden Sie in diesem Artikel .
quelle
String hql = "select userName from AccountInfo order by points desc 5";
Das hat bei mir ohne Verwendung funktioniert
setmaxResults();
Geben Sie einfach den Maximalwert im letzten (in diesem Fall 5) an, ohne das Schlüsselwort zu verwenden
limit
. : P.quelle
Meine Beobachtung ist, dass selbst wenn Sie ein Limit in der HQL (Ruhezustand 3.x) haben, dies entweder einen Analysefehler verursacht oder einfach ignoriert wird. (Wenn Sie eine Reihenfolge von + desc / asc vor dem Limit haben, wird diese ignoriert. Wenn Sie nicht desc / asc vor dem Limit haben, führt dies zu einem Analysefehler.)
quelle
Wenn kann ein Limit in diesem Modus verwalten
Dies ist ein wirklich einfacher Code, um ein Limit oder eine Liste zu behandeln.
quelle
quelle
Sie müssen eine native Abfrage schreiben, verweisen Sie darauf .
quelle
Sie können die folgende Abfrage verwenden
quelle
Das folgende Snippet wird verwendet, um eine Limit-Abfrage mit HQL durchzuführen.
Sie können die Demo-Anwendung unter diesem Link erhalten .
quelle
quelle