大话分页(一)
本文讨论范畴只在真分页,下面谈到的分页也特指真分页)。
分页共性
三种数据的分页方式的比较
MySql数据库特色分页
Oracle数据库常用分页
select T.*,rownum rn from () T where rownum <PageNo*PageSize) where rn >=(PageNo-1)*PageSize
select A.*,rownum rn from () A where rownum <41) where rn >=20
SqlServer数据常用分页
紧跟这第一页显示的记录之后的5条记录,也就是通过对userID字段进行降序排列时,它们是除了第一页数据之后的5条记录,也就是它们的userID不在第一页的UserID之中,在SQL语句有一个not in这个正好可以排上用场。 首先我们按照对UserID进行降序排序,查询出前面第一页使用的数据的UserID,SQL语句及执行结果如下:
select 5 userID from t_User order by userID asc) order by userID asc
select top(n-1)*5 userID from t_User order by userID asc) order by userID asc
Hibernate框架的分页
public class AbstractPageManager extends HibernateDaoSupport {
/**
* 根据HQL语句,获得查找总记录数的HQL语句 如:
* select ... from Organization o where o.parent is null
* 经过转换,可以得到:
* select count(*) from Organization o where o.parent is null
*
* @param hql
* @return
*/
private String getCountQuery(String hql) {
// 取得from的位置
int index = hql.indexOf("from");
// 返回:查询记录条数 的SQL语句
if (index != -1) {
return "select count(*) " + hql.substring(index);
}
throw new SystemException("无效的HQL查询语句");
}
/**
* 根据HQL语句进行分页查询
*
* @param hql HQL语句
* @param params HQL语句带的多个参数
* @param offSet 从第几个记录开始查询
* @param pageSize 每页显示多少行
* @return
*/
public PageModel searchPaginate(String hql, Object[] params, int offSet,
int pageSize) {
// 记录条数
String strCount = getCountQuery(hql);
// 查询条数
Query query = getSession().createQuery(strCount);
// 将HQL语句带的多个参数 赋值给Query
if (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
// 获取查询条数
int intCount = ((Long) query.uniqueResult()).intValue();
// 查询Organization记录
query = getSession().createQuery(hql);
// 将HQL语句带的多个参数 赋值给Query
if (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
/*
* offSet 设置从第几个记录开始查询
* pageSize 设置每页显示多少行
*/
query.setFirstResult(offSet);
query.setMaxResults(pageSize);
//组装PageModel
PageModel pageModel = new PageModel();
pageModel.setDatas(query.list());
pageModel.setTotal(intCount);
return pageModel;
}
}
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。