hibernate在spring中的分页



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&&paramMap.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/