Zum Beispiel:
100 Datensätze ab dem 20.000sten abrufen
Code:
Abfrage q = session.createQuery("from Cat as c");
q.setFirstResult (20000);
q.setMaxResults(100);
List l = q.list();
Wie implementiert die unterste Ebene von Hibernate Paging? Tatsächlich ist die Abfrage von Hibernate in der Klasse net.sf.hibernate.loader.Loader definiert. Wenn Sie den Code dieser Klasse sorgfältig lesen, können Sie das Problem vollständig verstehen.
Zeile 480 des Loader-Quellcodes von Hibernate2.0.3 lautet wie folgt:
Code:
if (useLimit) sql = dialect.getLimitString(sql);
PreparedStatement st = session.getBatcher().prepareQueryStatement(sql,
scrollable);
Wenn die entsprechende Datenbank eine SQL-Anweisung definiert, die Abfragedatensätze begrenzt, verwenden Sie direkt die SQL-Anweisung der jeweiligen Datenbank.
Dann schauen Sie sich net.sf.hibernate.dialect.MySQLDialect an:
Code:
public boolean unterstütztLimit() {
return true;
}
public String getLimitString(String sql) {
StringBuffer pagingSelect = new StringBuffer(100);
pagingSelect.append(sql);
pagingSelect.append(" limit ?, ?");
return pagingSelect. toString (); {
return true;
public String getLimitString(String sql) {
StringBuffer pagingSelect = new StringBuffer(100); row_.*, rownum rownum_
from ( ");
pagingSelect.append(sql);
pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
return pagingSelect.toString(); Die rownum der Abfrageanweisung der Ebene Bestellung nach kann nicht unterstützt werden.
Darüber hinaus unterstützen Interbase, PostgreSQL und HSQL auch Paging-SQL-Anweisungen. Sie können im entsprechenden Dialekt darauf verweisen.
Wenn die Datenbank keine Paging-SQL-Anweisungen unterstützt, ist gemäß dem #hibernate.jdbc.use_scrollable_resultset true in der Konfigurationsdatei der Standardwert true. Wenn Sie nicht false angeben, verwendet Hibernate das scrollableresult von JDBC2.0, um es zu implementieren, schauen Sie sich die folgende Zeile 430 von Loader an:
Code:
if ( session.getFactory().useScrollableResultSets() ) {
// wir können gehe direkt zur ersten erforderlichen Zeile
rs.absolute(firstRow);
}
else {
// wir müssen zeilenweise Schritt für Schritt durch die Zeilen gehen (langsam)
for ( int m=0; m
Wenn scrollbare Ergebnisse unterstützt werden, verwenden Sie die absolute Methode von ResultSet, um direkt zum Startpunkt der Abfrage zu gelangen . Wenn nicht, verwenden Sie eine Schleifenanweisung und rs.next, um Stück für Stück weiterzumachen.
Es ist ersichtlich, dass Hibernate eine große Flexibilität bei Abfrage- und Paging-Vorgängen bietet. Wenn dies nicht funktioniert, versuchen Sie es mit Scrollable Arbeit, schließlich verwenden Sie die Methode rset.next() zum Verschieben.
Einer der Vorteile der Verwendung von Hibernate im Abfrage-Paging-Code besteht darin, dass es nicht nur die Leistung des Abfrage-Pagings berücksichtigt, sondern auch die Portabilität des Codes zwischen verschiedenen Datenbanken gewährleistet.