例:
20,000件目から100件取得します
コード:
Query q = session.createQuery("from Cat as c");
q.setFirstResult(20000);
q.setMaxResults(100);
List l = q.list();
では、Hibernate の最下層はどのようにページングを実装しているのでしょうか?実際、Hibernate のクエリは net.sf.hibernate.loader.Loader クラスで定義されています。このクラスのコードを注意深く読めば、問題を完全に理解できます。
Hibernate2.0.3のLoaderソースコードの480行目は以下の通りです:
Code:
if (useLimit) sql =方言.getLimitString(sql);
PreparedStatement st = session.getBatcher().prepareQueryStatement(sql,
)スクロール可能);
対応するデータベースがクエリレコードを制限する SQL ステートメントを定義している場合は、特定のデータベースの SQL ステートメントを直接使用します。
次に net.sf.hibernate.dialect.MySQLDialect:
Code:
public boolean supportLimit() {
return true;
}
public String getLimitString(String sql) {
StringBuffer pagingSelect = new StringBuffer( 100) ;
pagingSelect.append(sql);
pagingSelect.append("制限?, ?");
return pagingSelect.toString(); 方言.Oracle9Dialect:
コード:
public boolean supportLimit() {
return true;
}
public String getLimitString(String sql) {
StringBuffer pagingSelect = new StringBuffer (100);
pagingSelect.append("select * from ( select row_.*, rownum rownum_
from ( ");
pagingSelect.append(sql );
pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
return pagingSelect.toString ();
}
Oracle は、rownum と組み合わせた 3 レベルのネストされたクエリ ステートメントを使用して実装しますページングは、1 つまたは 2 つのレベルのクエリ ステートメントのみの rownum が order by をサポートできない場合、これが最も速い方法です。
さらに、Interbase、PostgreSQL、HSQL もページング SQL ステートメントをサポートしており、対応する Dialect で参照できます。
データベースがページング SQL ステートメントをサポートしていない場合、設定ファイルの #hibernate.jdbc.use_scrollable_resultset true に従って、false に指定しない場合、Hibernate は JDBC2 のスクロール可能な結果を使用します。ページングを実装するには、ローダー行 430 以下を参照してください:
コード:
if ( session.getFactory().useScrollableResultSets() ) {
// 最初の必要な行に直接移動できます
rs.absolute(firstRow);
}
else {
/ / 一度に1行ずつ行をステップスルーする必要があります(遅い)
for ( int m=0; m
スクロール可能な結果の場合サポートされている場合は、ResultSet の絶対メソッドを使用します。これがサポートされていない場合は、loop ステートメントと rs.next を使用して少しずつ移動します。
Hibernate を使用すると、クエリとページング操作に優れた柔軟性があることがわかります。Hibernate は、最初に特定のデータベースのページング SQL を使用しようとします。それが機能しない場合は、最後に Scrollable を使用します。 rset.next() で移動するメソッド。
クエリ ページング コードで Hibernate を使用する大きな利点の 1 つは、クエリ ページングのパフォーマンスが考慮されるだけでなく、異なるデータベース間でのコードの移植性も確保されることです。