您的位置:首页 > 数据库

数据库分页sql和hibernatetemplate分页操作

2018-05-11 19:50 92 查看

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;

}
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: