理解Hibernate中的query.setFirstResult(),query.setMaxResults(),取出任意n条数据
引用:http://blog.csdn.net/switzerland/article/details/3127992
一、query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示。那么两者区别,以及两者的效率如何?
答:1.scroll是用JDBC2.0的可滚动结果集实现;query.setMaxResults();query.setFirstResult()是数据库SQL语句实现。
2.你说是在数据库就分页好呢?还是把结果集都取到内存再分页好呢?(应该是在数据库就分了好些吧,但是如果在内存分页的话,换页的时候是不是更快一些呢?)
3.在数据库进行分页是首选的方式。数据库分页实际上是利用数据库本身SQL扩展的功能进行分页,例如MySQL的limit0,50这样的SQL语句。不但速度快,而且非常节省内存。不过不是每种数据库的都有这种分页支持的SQL,例如SQLServer就不支持。
4.scroll是利用JDBC2.0的功能做分页的,那么就完全取决于特定数据库的JDBCDriver的实现了。事实上大部分JDBCDriver都是把所有的结果集都一次取到内存,然后再分页的。如果这个结果集非常大,例如几万条,不但程序执行速度会很慢,而且很容易导致outofmemory。当然个别JDBCDriver使用了服务器端游标来实现,那么就不会导致这种问题,例如jTDS。
二、Hibernate可以使用Query.setMaxResults方法简单地设置需要查询的最大结果集。
然后Hibernate会自动根据所设置的数据库方言翻译成相应的SQL语句提交给数据库。比如如果数据库是Oracle,SQLServer等,则翻译为类似select...top10之类的SQL语句,若是MySQL,则翻译为select...limit10之类的SQL。
三、举例:
query.setFirstResult(0),query.setMaxResults(4);相当于MySQL中的limit0,4;
publicvoidtestQuery(){
Sessionsession=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Queryquery=session.createQuery("fromUser");
query.setFirstResult(0);//从第一条记录开始
query.setMaxResults(4);//取出四条记录
ListuserList=query.list();
for(Iteratoriter=userList.iterator();iter.hasNext();){
Useruser=(User)iter.next();
System.out.println(user.getId());
System.out.println(user.getName());
}
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}