hibernate在spring中的分页。
package com.salt.commons;
import java.math.BigInteger;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.type.Type;
import org.springframework.orm.hibernate3.HibernateCallback;
/**
* 查询分页
* @author haoliang
*
*/
public class PagerService implements HibernateCallback {
//分页对象
private PageBean pageBean;
private PagerService() {}
/**
* 初始化分页对象
* @param pageBean
*/
public PagerService(PageBean pageBean) {
this.pageBean = pageBean;
}
/**
* 重写回调接口方法
*/
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
int flag=pageBean.getSqlOrHql();
//执行hql
if(flag==Constant.HQL){
return doInHql(session);
//执行sql
} else if(flag==Constant.SQL){
return doInSql(session);
//其它情况
} else {
return null;
}
}
/**
* 根据hql查询分页
* @param session
* @return list
* @throws HibernateException
* @throws SQLException
*/
public Object doInHql(Session session) throws HibernateException,
SQLException {
//hql语句
StringBuffer sbf = new StringBuffer(“”);
if (pageBean.getHql() != null && !”".equals(pageBean.getHql())) {
sbf.append(pageBean.getHql());
}
//根据hql语句返回总记录数
String hqlCount = “select count(*) “
+ sbf.substring(sbf.indexOf(“from”));
//执行查询语句
Query query = session.createQuery(hqlCount);
if (pageBean.getHqlParam() != null) {
// hql参数列表获取
Object[] param = pageBean.getHqlParam();
// 为hql设置参数
for (int i = 0; i < param.length; i++) {
if(param[i]==null){
continue;
}
query.setParameter(i, param[i]);
}
}
// 当前总记录数
int results = ((Long) query.uniqueResult()).intValue();
//总页数
int pageNum = (results / pageBean.getPageSize()) + (results
% pageBean.getPageSize() > 0 ? 1 : 0);
if(pageBean.getPageNum()<=0){
pageBean.setPageNum(1);
}
if (pageBean.getPageNum() > pageNum) {
// 当前页
pageBean.setPageNum(pageNum);
}
if (pageNum == 0) {
pageBean.setPageNum(0);
pageBean.setPageCount(0);
return pageBean;
}
query = session.createQuery(pageBean.getHql());
if (pageBean.getHqlParam() != null) {
// hql参数列表获取
Object[] param = pageBean.getHqlParam();
// 为hql设置参数
for (int i = 0; i < param.length; i++) {
if(param[i]==null){
continue;
}
query.setParameter(i, param[i]);
}
}
//设置分页开始记录点
query.setFirstResult((pageBean.getPageNum() – 1)
* pageBean.getPageSize());
//显示最大记录数
query.setMaxResults(pageBean.getPageSize());
// 查询结果列表
pageBean.setResultList(query.list());
// 当前总记录数
pageBean.setResultCount(results);
// 总页数
pageBean.setPageCount(pageNum);
//分页标签合成
if (pageBean.getPageNum() == 0) {
pageBean.setRedirectUrl(“”);
} else if (pageBean.getPageNum() == 1) {
if (pageBean.getPageNum() == pageBean.getPageCount()) {
pageBean
.setRedirectUrl(“<div><a>首页</a><a>上一页</a><a>下一页</a><a>尾页</a></div>”);
}
if (pageBean.getPageNum() < pageBean.getPageCount()) {
pageBean.setRedirectUrl(“<div><a>首页</a>” + “<a>上一页</a>”
+ “<a href=\”javascript:nextPage();\”>下一页</a>”
+ “<a href=\”javascript:lastPage();\”>尾页</a></div>”);
}
} else if (pageBean.getPageNum() > 1
&& pageBean.getPageNum() < pageBean.getPageCount()) {
pageBean
.setRedirectUrl(“<div><a href=\”javascript:firstPage();\”>首页</a>”
+ “<a href=\”javascript:previousPage();\”>上一页</a>”
+ “<a href=\”javascript:nextPage();\”>下一页</a>”
+ “<a href=\”javascript:lastPage();\”>尾页</a></div>”);
} else if (pageBean.getPageNum() > 1
&& pageBean.getPageNum() == pageBean.getPageCount()) {
pageBean
.setRedirectUrl(“<div><a href=\”javascript:firstPage();\”>首页</a>”
+ “<a href=\”javascript:previousPage();\”>上一页</a>”
+ “<a>下一页</a>” + “<a>尾页</a></div>”);
}
return pageBean;
}
/**
* 根据sql查询分页
* @param session
* @return list
* @throws HibernateException
* @throws SQLException
*/
public Object doInSql(Session session) throws HibernateException,
SQLException, SecurityException {
//sql语句
StringBuffer sbf = new StringBuffer(“”);
if (pageBean.getSql() != null && !”".equals(pageBean.getSql())) {
sbf.append(pageBean.getSql());
}
//根据sql查询总记录数
String sqlCount = “select count(*) “
+ sbf.substring(sbf.indexOf(“from”));
//By 王晨
SQLQuery query = session.createSQLQuery(sqlCount);
if (pageBean.getSqlParam() != null) {
// sql参数列表获取
Object[] param = pageBean.getSqlParam();
// 为sql设置参数
for (int i = 0; i < param.length; i++) {
if(param[i]==null){
continue;
}
//虽然是SQL查询,但并非JDBC,而是hibernate的SQL查询,所以参数索引依然从0开始 —-by 王晨
// query.setParameter(i+1, param[i]);
query.setParameter(i, param[i]);
}
}
// 当前总记录数
int results = ((BigInteger) query.uniqueResult()).intValue();
//总页数
int pageNum = (results / pageBean.getPageSize()) + (results
% pageBean.getPageSize() > 0 ? 1 : 0);
if(pageBean.getPageNum()<=0){
pageBean.setPageNum(1);
}
if (pageBean.getPageNum() > pageNum) {
// 当前页
pageBean.setPageNum(pageNum);
}
if (pageNum == 0) {
pageBean.setPageNum(0);
pageBean.setPageCount(0);
return pageBean;
}
//By 王晨
query = session.createSQLQuery(pageBean.getSql()).addEntity(pageBean.getBeanClass());
if (pageBean.getSqlParam() != null) {
// sql参数列表获取
Object[] param = pageBean.getSqlParam();
// 为sql设置参数
for (int i = 0; i < param.length; i++) {
if(param[i]==null){
continue;
}
query.setParameter(i, param[i]);
}
}
//指定 执行SQL查询时字段所对应的hibernate类型 By 王晨
Map<String, Type> paramMap = pageBean.getParamMap();
if(paramMap!=null&¶mMap.size()>0){
Set entrySet = paramMap.entrySet();
for (Iterator it = entrySet.iterator(); it.hasNext();) {
Entry entry = (Entry) it.next();
query = query.addScalar((String) entry.getKey(),
(Type) entry.getValue());
}
}
//设置起始记录点
query.setFirstResult((pageBean.getPageNum() – 1)
* pageBean.getPageSize());
//最大显示记录数
query.setMaxResults(pageBean.getPageSize());
//封装新Bean By 王晨
List l = query.list();
List newL = new ArrayList();
for(int i=0;i<l.size();i++){
Object[] obj = (Object[])l.get(i);
//Class clazz = pageBean.getBeanClass();
Object o = (Object)obj[0];
newL.add(o);
}
// 查询结果列表
pageBean.setResultList(newL);
// 当前总记录数
pageBean.setResultCount(results);
// 总页数
pageBean.setPageCount(pageNum);
if (pageBean.getPageNum() == 0) {
pageBean.setRedirectUrl(“”);
} else if (pageBean.getPageNum() == 1) {
if (pageBean.getPageNum() == pageBean.getPageCount()) {
pageBean
.setRedirectUrl(“<div><a>首 页</a> <a>上一页</a> <a>下一页</a> <a>尾 页</a></div>”);
}
if (pageBean.getPageNum() < pageBean.getPageCount()) {
pageBean.setRedirectUrl(“<div><a>首 页</a> ” + “<a>上一页</a> “
+ “<a href=\”javascript:nextPage();\”>下一页</a> “
+ “<a href=\”javascript:lastPage();\”>尾 页</a></div>”);
}
} else if (pageBean.getPageNum() > 1
&& pageBean.getPageNum() < pageBean.getPageCount()) {
pageBean
.setRedirectUrl(“<div><a href=\”javascript:firstPage();\”>首 页</a> “
+ “<a href=\”javascript:previousPage();\”>上一页</a> “
+ “<a href=\”javascript:nextPage();\”>下一页</a> “
+ “<a href=\”javascript:lastPage();\”>尾 页</a></div>”);
} else if (pageBean.getPageNum() > 1
&& pageBean.getPageNum() == pageBean.getPageCount()) {
pageBean
.setRedirectUrl(“<div><a href=\”javascript:firstPage();\”>首 页</a> “
+ “<a href=\”javascript:previousPage();\”>上一页</a> “
+ “<a>下一页</a> ” + “<a>尾 页</a></div>”);
}
return pageBean;
}
}
这个是pagebean
/**
* File name : PageBean.java
* package : com.salt.commons
* Project : salt
* Date : 2009-4-21
* Copyright (c) 2009 Lneol, Inc. All Rights Reserved.
*/
package com.salt.commons;
import java.util.List;
import java.util.Map;
import org.hibernate.type.Type;
/**
*
* 分頁bean
* @author haol
* @version 1.0 2009-4-21 下午03:13:15
*/
public class PageBean {
// 显示页码
private int pageNum;
// 一页显示的记录数
private int pageSize=Constant.PAGE_SIZE;
// 总页数
private int pageCount;
// 总记录数
private int resultCount;
// 集合列表
private List resultList;
// 执行的sql语句
private String sql;
// 执行的hql语句
private String hql;
// 执行查询语句的类型
private int sqlOrHql;
// hql参数列表
private Object[] hqlParam;
// 页面跳转
private String redirectUrl;
// sql参数列表
private Object[] sqlParam;
//sql实体类型
private Class beanClass;
//执行SQL查询时字段所对应的hibernate类型MAP by 王晨
private Map<String, Type> paramMap;
public Map<String, Type> getParamMap() {
return paramMap;
}
public void setParamMap(Map<String, Type> paramMap) {
this.paramMap = paramMap;
}
/**
* 获取sql实体类型
* @return
*/
public Class getBeanClass() {
return beanClass;
}
/**
* 设置sql实体类型
* @param beanClass
*/
public void setBeanClass(Class beanClass) {
this.beanClass = beanClass;
}
/**
* 获取sql参数列表
* @return
*/
public Object[] getSqlParam() {
return sqlParam;
}
/**
* 设置sql参数列表
* @param sqlParam
*/
public void setSqlParam(Object[] sqlParam) {
this.sqlParam = sqlParam;
}
/**
* 获取页面跳转
* @return
*/
public String getRedirectUrl() {
return redirectUrl;
}
/**
* 设置页面跳转
* @param redirectUrl
*/
public void setRedirectUrl(String redirectUrl) {
this.redirectUrl = redirectUrl;
}
/**
* 获取hql参数列表
*
* @return
*/
public Object[] getHqlParam() {
return hqlParam;
}
/**
* 设置hql参数列表
*
* @param hqlParam
*/
public void setHqlParam(Object[] hqlParam) {
this.hqlParam = hqlParam;
}
/**
* 获取显示页码
*
* @return
*/
public int getPageNum() {
return pageNum;
}
/**
* 设置显示页码
*
* @param pageNum
*/
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
/**
* 获取一页显示的记录数
*
* @return
*/
public int getPageSize() {
return pageSize;
}
/**
* 设置一页显示的记录数
*
* @param pageSize
*/
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
/**
* 获取总页数
*
* @return
*/
public int getPageCount() {
return pageCount;
}
/**
* 设置总页数
*
* @param pageCount
*/
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
/**
* 获取总记录数
*
* @return
*/
public int getResultCount() {
return resultCount;
}
/**
* 设置总记录数
*
* @param resultCount
*/
public void setResultCount(int resultCount) {
this.resultCount = resultCount;
}
/**
* 获取集合列表
*
* @return
*/
public List getResultList() {
return resultList;
}
/**
* 设置集合列表
*
* @param resultList
*/
public void setResultList(List resultList) {
this.resultList = resultList;
}
/**
* 获取执行的sql语句
*
* @return
*/
public String getSql() {
return sql;
}
/**
* 设置执行的sql语句
*
* @param sql
*/
public void setSql(String sql) {
this.sql = sql;
}
/**
* 获取执行的hql语句
*
* @return
*/
public String getHql() {
return hql;
}
/**
* 设置执行的hql语句
*
* @param hql
*/
public void setHql(String hql) {
this.hql = hql;
}
/**
* 获取执行查询语句的类型
*
* @return
*/
public int getSqlOrHql() {
return sqlOrHql;
}
/**
* 设置执行查询语句的类型
*
* @param sqlOrHql
*/
public void setSqlOrHql(int sqlOrHql) {
this.sqlOrHql = sqlOrHql;
}
}
http://blog.163.com/farain_2001/blog/static/12489332120097177123414/