Hibernate中的query.setFirstResult(),query.setMaxResults();

1、query.scroll()和query.setFirstResult(),query.setMaxResults();這兩種方法均可以取到必定範圍內的數據,用來數據分頁顯示。那麼二者區別,以及二者的效率如何? 
答:1.scroll是用JDBC2.0的可滾動結果集實現;query.setMaxResults();query.setFirstResult()是數據庫SQL語句實現。數據庫

2.你說是在數據庫就分頁好呢?仍是把結果集都取到內存再分頁好呢?(應該是在數據庫就分了好些吧,可是若是在內存分頁的話,換頁的時候是否是更快一些呢?)服務器

3.在數據庫進行分頁是首選的方式。數據庫分頁其實是利用數據庫自己SQL擴展的功能進行分頁,例如MySQL的 limit 0,50這樣的SQL語句。不但速度快,並且很是節省內存。不過不是每種數據庫的都有這種分頁支持的SQL,例如SQL Server就不支持。session

4.scroll是利用JDBC2.0的功能作分頁的,那麼就徹底取決於特定數據庫的JDBC Driver的實現了。事實上大部分JDBC Driver都是把全部的結果集都一次取到內存,而後再分頁的。若是這個結果集很是大,例如幾萬條,不但程序執行速度會很慢,並且很容易致使out of memory。固然個別JDBC Driver使用了服務器端遊標來實現,那麼就不會致使這種問題,例如jTDS。
 翻譯

2、Hibernate可使用Query.setMaxResults方法簡單地設置須要查詢的最大結果集。
而後Hibernate會自動根據所設置的數據庫方言翻譯成相應的SQL語句提交給數據庫。好比若是數據庫是Oracle,SQL Server等,則翻譯爲相似select ... top 10之類的SQL語句,如果MySQL,則翻譯爲select ... limit 10之類的SQL。內存


3、舉例:
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);
  }
}
 get

相關文章
相關標籤/搜索