ホームページ  >  記事  >  バックエンド開発  >  Hibernate を使用してページング クエリを実装する

Hibernate を使用してページング クエリを実装する

巴扎黑
巴扎黑オリジナル
2016-12-20 16:39:231166ブラウズ

例:
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 つは、クエリ ページングのパフォーマンスが考慮されるだけでなく、異なるデータベース間でのコードの移植性も確保されることです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。