(改ページ)Hibernateのquery.setFirstResult(),query.setMaxResults();
2152 ワード
setFirstResultは開始データ、setMaxResultsはクエリー表示データです.
ページングプログラムの中にsetFirstResultの値が(現在のページ-1)Xの1ページあたりの本数であるべきであれば、setMaxResultsは1ページあたりの本数である.
一、query.scroll()とquery.setFirstResult(),query.setMaxResults();この2つの方法はいずれも一定範囲のデータを取得して、データのページング表示に使用することができます.では、両者の違いと、両者の効率はどうですか.
答え:1.scrollはJDBC 2を用いる.0のスクロール可能な結果セットを実装します.query.setMaxResults();query.setFirstResult()は、データベースSQL文実装です.
2.データベースでページを分けたほうがいいと言っていますか.それとも結果セットをメモリに取り出してページを分けたほうがいいですか?△データベースで分けたほうがいいのではないでしょうか.しかし、メモリでページを分けると、ページを変えるのがもっと早いのではないでしょうか.
3.データベースでページングするのが優先です.データベースページングは、実際にはデータベース自体のSQL拡張機能を利用してページングされます.例えば、MySQLのlimit 0,50のようなSQL文です.速度が速いだけでなく、メモリも非常に節約できます.ただし、各データベースにこのようなページングサポートされているSQLがあるわけではありません.たとえば、SQLサーバはサポートされていません.
4.scrollはJDBC 2を利用する.0の機能をページングすると、特定のデータベースのJDBC Driverの実装に完全に依存します.実際、ほとんどのJDBC Driverは、すべての結果セットを一度にメモリに取り出し、ページを分割します.この結果セットが非常に大きく、例えば数万個であれば、プログラムの実行速度が遅いだけでなく、out of memoryを招きやすい.もちろん、個々のJDBC Driverがサーバ側カーソルを使用して実装される場合、jTDSなどの問題は発生しません.
二、HibernateはQueryを使用できる.setMaxResultsメソッドは、クエリーが必要な最大結果セットを簡単に設定します.
その後、Hibernateは設定されたデータベースの方言に基づいて対応するSQL文に自動的に翻訳されてデータベースにコミットされます.たとえば、データベースがOracle、SQL Serverなどの場合、selectのように翻訳されます.top 10のようなSQL文、MySQLならselect...limit 10とかのSQL.
三、例:
query.setFirstResult(0),query.setMaxResults(4);MySQLのlimit 0,4に相当します.
ページングプログラムの中にsetFirstResultの値が(現在のページ-1)Xの1ページあたりの本数であるべきであれば、setMaxResultsは1ページあたりの本数である.
一、query.scroll()とquery.setFirstResult(),query.setMaxResults();この2つの方法はいずれも一定範囲のデータを取得して、データのページング表示に使用することができます.では、両者の違いと、両者の効率はどうですか.
答え:1.scrollはJDBC 2を用いる.0のスクロール可能な結果セットを実装します.query.setMaxResults();query.setFirstResult()は、データベースSQL文実装です.
2.データベースでページを分けたほうがいいと言っていますか.それとも結果セットをメモリに取り出してページを分けたほうがいいですか?△データベースで分けたほうがいいのではないでしょうか.しかし、メモリでページを分けると、ページを変えるのがもっと早いのではないでしょうか.
3.データベースでページングするのが優先です.データベースページングは、実際にはデータベース自体のSQL拡張機能を利用してページングされます.例えば、MySQLのlimit 0,50のようなSQL文です.速度が速いだけでなく、メモリも非常に節約できます.ただし、各データベースにこのようなページングサポートされているSQLがあるわけではありません.たとえば、SQLサーバはサポートされていません.
4.scrollはJDBC 2を利用する.0の機能をページングすると、特定のデータベースのJDBC Driverの実装に完全に依存します.実際、ほとんどのJDBC Driverは、すべての結果セットを一度にメモリに取り出し、ページを分割します.この結果セットが非常に大きく、例えば数万個であれば、プログラムの実行速度が遅いだけでなく、out of memoryを招きやすい.もちろん、個々のJDBC Driverがサーバ側カーソルを使用して実装される場合、jTDSなどの問題は発生しません.
二、HibernateはQueryを使用できる.setMaxResultsメソッドは、クエリーが必要な最大結果セットを簡単に設定します.
その後、Hibernateは設定されたデータベースの方言に基づいて対応するSQL文に自動的に翻訳されてデータベースにコミットされます.たとえば、データベースがOracle、SQL Serverなどの場合、selectのように翻訳されます.top 10のようなSQL文、MySQLならselect...limit 10とかのSQL.
三、例:
query.setFirstResult(0),query.setMaxResults(4);MySQLのlimit 0,4に相当します.
public void testQuery() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Query query = session.createQuery("from User");
query.setFirstResult(0);//
query.setMaxResults(4);//
List userList = query.list();
for (Iterator iter=userList.iterator(); iter.hasNext();) {
User user = (User)iter.next();
System.out.println(user.getId());
System.out.println(user.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}