Hibernate用Query作分页实例源码。Query提供了两个方法以实现分页:
query.setFirstResult(int) 设置第一条记录开始的位置
query.setMaxResults(int) 设置返回的纪录总条数
在前面的BookDao的接口和实现类中添加一个方法:
[java] view plaincopyprint?
01.public List
02. Query query = getSession().createQuery(“from Book”);
03. query.setFirstResult(pageBegin);
04. query.setMaxResults(pageSize);
05. return query.list();
06.}
public List
Query query = getSession().createQuery(“from Book”);
query.setFirstResult(pageBegin);
query.setMaxResults(pageSize);
return query.list();
}
这样看起来很简单, 我比较感兴趣的是Hibernate内部是怎么实现了。我手头有sybase, sqlserver2005, oracle8.1, 我分别作了实验看怎么写出一个可分页的sql.下面我就以从第11条记录开始取5条记录 来做例子。
oracle因为 返回的记录集里面默认有一个rownum行号,可以利用这个来分页:为什么要有子查询和给rownum 取别名,要仔细想一想:
select * from (select rownum as myid, book.* from book) where myid> 10 and myid<= 15
sqlserver因为可以select top 所以可以这么做:
select top 5 * from etl.letter where id not in (
select top 10 id from etl.letter
)
但是这句话在同样支持select top的Sybase中不work,似乎子查询中不能用select top.但是这并不是问题,可以select前15条记录,然后在jdbc中忽略前10条, 这样也可以达到效果.
如果是MySql,可以有: SELECT * FROM my_table LIMIT 10, 5, 但是我手头没有这样的数据库.所以没有测试.
jdk 1.5中的Statement可以设置maxRows, statement.setMaxRows(int),这种方式很好与数据库无关.