数据库分页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; }阅读更多
- sqldatareader 分批,分页操作数据库
- 数据库常用sql语句和操作
- SQL语句行列转换(附带数据库、表、视图操作)
- JAVA数据库操作方面的知识总结(java.sql.*)
- java中操作数据库及分页的问题探讨
- 在本机通过SQL远程操作数据库
- 用sql语句实现数据库的操作(包括角色、权限、用户、存储过程)
- 学习操作oracle.sql.Blob数据类型,向数据库插入Blob数据类型的数据
- websql的使用/phonegap操作数据库 sqlite
- OPENQUERY (Transact-SQL),跨数据库操作。
- sql 恢复备份数据库的操作
- VS2010 操作SQL Server CE 数据库实例 (WebForm)
- Unity数据库SQL操作
- LINQ to SQL更新数据库操作
- 数据库操作之分页、去重复
- Yii1.1中通过Sql查询进行的分页操作
- SQL不同服务器数据库之间的数据操作整理(完整版)
- sql操作数据库处理
- mysql:SQL语句操作数据库中表和字段的comment值
- Vertica数据库sql操作备忘