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

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;

       }    

猜你喜欢

转载自blog.csdn.net/zlc521520/article/details/80285890
今日推荐