Hibernate中的query.setFirstResult(),query.setMaxResu

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

相关文章
相关标签/搜索