MySQL
-- 从10行开始,查询20行;即查询10~30行的数据
select * from table limit 10,20
Oracle
select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow
上面的rownum开始为啥是 小于 而不是大于号呢, 因为rownum是从1开始赋值的。
DB2
select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by 列名) as a) where rc between startrow and endrow
上面的over()函数里面可以含有参数,分组partition by 和排序 order by 排序后面可以跟多个需要排序的字段中间用逗号隔开 执行的顺序是先执行over()函数里面的排序,然后通过rownumber()函数给结果集排序号,从1开始逐增,如果select后面有自带的order by 字段, 在执行这里的。但是此时的rc序号,就可能不是之前的递增顺序了。
SQLServer
(1)SQLServer 2000
select top pagesize * from 表名 where 列名 not in(select top pagesize*page 列名 from 表名 order by 列名) order by 列名
(2)SQLServer 2005
select * from (select 列名,row_搜索number() over(order by 列名1) as 别名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow
PostgreSQL
select * from 表名 limit pagesize,offset startrow
通用分页SQL
select * from (
select * from tb_student where sid not in(
select sid from tb_student where rownum<=(currentPage-1)*pageSize)
) where rownum <=pageSize;
如果是用hibernatetemplate操作数据库,Hibernate可以使用Query.setMaxResults方法简单地设置需要查询的最大结果集。
然后Hibernate会自动根据所设置的数据库方言翻译成相应的SQL语句提交给数据库。比如如果数据库是Oracle,SQL Server等,则翻译为类似select … top 10之类的SQL语句,若是MySQL,则翻译为select … limit 10之类的SQL。
在使用Hibernate时,可以用
query.setFirstResult(10);//设置取值的开始位置转化sql为 10+1
query.setMaxResults(20); //设置读取数据的记录条数 10+20
方便的实现分页。
但是Spring 整合 Hibernate 时候用的 HibernateTemplate 却不支持分页,这样当查询记录过多时,就会给我们带来一些麻烦,因此需要自己包装一个类进行分页,具体实现如下:
使用spring的hibernateTemplate的回调机制扩展hibernateTemplate的功能实现分页。其中HibernateCallback()是一个接口,这种回调方式也是在java中常用的方法。
/**
* 使用hql 语句进行操作
* @param hql 需要执行的hql语句
* @param offset 设置开始位置
* @param length 设置读取数据的记录条数
* @return List 返回所需要的集合。
*/
public List getListForPage(final String hql, final int offset,
final int length) {
List list = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(offset);//开始位置
query.setMaxResults(length);//pagesize
List list = query.list();
return list;
}
});
return list;
}