(改ページ)Hibernateのquery.setFirstResult(),query.setMaxResults();


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に相当します.
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);
   }
}