Hibernate学习笔记:用Query作分页

Query提供了两个方法以实现分页:
query.setFirstResult(int) 设置第一条记录开始的位置
query.setMaxResults(int) 设置返回的纪录总条数
在前面的BookDao的接口和实现类中添加一个方法:
public List<Book> pagedList(int pageBegin, int pageSize){ 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),这种方式很好与数据库无关.

 

你可能感兴趣的:(oracle,Hibernate,数据库,Sybase,query,sqlserver)