ssh2通用分页

第一步:新建一个Page类

  1: package org.ewms2rbac.model;
  2: 
  3: import java.util.ArrayList;
  4: import java.util.List;
  5: 
  6: public class Page<T> {
  7: 	protected int pageNo = 1;
  8: 	protected int pageSize = 1;
  9: 	protected List<T> result = new ArrayList<T>();
 10: 	protected long totalCount = -1;
 11: 
 12: 	public Page() {
 13: 	}
 14: 
 15: 	public Page(final int pageSize) {
 16: 		setPageSize(pageSize);
 17: 	}
 18: 
 19: 	/**
 20: 	 * 获得当前页的页号,序号从1开始,默认为1.
 21: 	 */
 22: 	public int getPageNo() {
 23: 		return pageNo;
 24: 	}
 25: 
 26: 	/**
 27: 	 * 设置当前页的页号,序号从1开始,低于1时自动调整为1.
 28: 	 */
 29: 	public void setPageNo(final int pageNo) {
 30: 		this.pageNo = pageNo;
 31: 
 32: 		if (pageNo < 1) {
 33: 			this.pageNo = 1;
 34: 		}
 35: 	}
 36: 
 37: 	/**
 38: 	 * 获得每页的记录数量,默认为1.
 39: 	 */
 40: 	public int getPageSize() {
 41: 		return pageSize;
 42: 	}
 43: 
 44: 	/**
 45: 	 * 设置每页的记录数量,低于1时自动调整为1.
 46: 	 */
 47: 	public void setPageSize(final int pageSize) {
 48: 		this.pageSize = pageSize;
 49: 
 50: 		if (pageSize < 1) {
 51: 			this.pageSize = 1;
 52: 		}
 53: 	}
 54: 
 55: 	/**
 56: 	 * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.
 57: 	 */
 58: 	public int getFirst() {
 59: 		return ((pageNo - 1) * pageSize) + 1;
 60: 	}
 61: 
 62: 	/**
 63: 	 * 取得页内的记录列表.
 64: 	 */
 65: 	public List<T> getResult() {
 66: 		return result;
 67: 	}
 68: 
 69: 	public void setResult(final List<T> result) {
 70: 		this.result = result;
 71: 	}
 72: 
 73: 	/**
 74: 	 * 取得总记录数, 默认值为-1.
 75: 	 */
 76: 	public long getTotalCount() {
 77: 		return totalCount;
 78: 	}
 79: 
 80: 	public void setTotalCount(final long totalCount) {
 81: 		this.totalCount = totalCount;
 82: 	}
 83: 
 84: 	/**
 85: 	 * 根据pageSize与totalCount计算总页数, 默认值为-1.
 86: 	 */
 87: 	public long getTotalPages() {
 88: 		if (totalCount < 0)
 89: 			return -1;
 90: 
 91: 		long count = totalCount / pageSize;
 92: 		if (totalCount % pageSize > 0) {
 93: 			count++;
 94: 		}
 95: 		return count;
 96: 	}
 97: 
 98: 	/**
 99: 	 * 是否还有下一页.
100: 	 */
101: 	public boolean isHasNext() {
102: 		return (pageNo + 1 <= getTotalPages());
103: 	}
104: 
105: 	/**
106: 	 * 取得下页的页号, 序号从1开始. 当前页为尾页时仍返回尾页序号.
107: 	 */
108: 	public int getNextPage() {
109: 		if (isHasNext())
110: 			return pageNo + 1;
111: 		else
112: 			return pageNo;
113: 	}
114: 
115: 	/**
116: 	 * 是否还有上一页.
117: 	 */
118: 	public boolean isHasPre() {
119: 		return (pageNo - 1 >= 1);
120: 	}
121: 
122: 	/**
123: 	 * 取得上页的页号, 序号从1开始. 当前页为首页时返回首页序号.
124: 	 */
125: 	public int getPrePage() {
126: 		if (isHasPre())
127: 			return pageNo - 1;
128: 		else
129: 			return pageNo;
130: 	}
131: }
132: 

第二步:事务不支持泛型,新建一个帮助类如果返回的是一个泛型可通过此帮助类ReflectionUtils

直接返回该泛型类,避免报错。

  1: package org.ewms2rbac.utils;
  2: 
  3: import java.lang.reflect.ParameterizedType;
  4: import java.lang.reflect.Type;
  5: 
  6: public class ReflectionUtils {
  7: 
  8: 	public static Class getSuperClassGenricType(final Class clazz) {
  9: 
 10: 		Type genType = clazz.getGenericSuperclass();
 11: 
 12: 		if (!(genType instanceof ParameterizedType)) {
 13: 			return Object.class;
 14: 		}
 15: 
 16: 		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
 17: 
 18: 		if (!(params[0] instanceof Class)) {
 19: 			return Object.class;
 20: 		}
 21: 
 22: 		return (Class) params[0];
 23: 	}
 24: 
 25: }
 26: 

 

第三步:创建HibernateBaseDao

 

  1: package org.ewms2rbac.dao;
  2: 
  3: import java.io.Serializable;
  4: import java.lang.reflect.ParameterizedType;
  5: import java.util.List;
  6: 
  7: import org.apache.commons.lang.StringUtils;
  8: import org.ewms2rbac.model.Page;
  9: import org.ewms2rbac.utils.ReflectionUtils;
 10: import org.hibernate.Criteria;
 11: import org.hibernate.Query;
 12: import org.hibernate.criterion.Criterion;
 13: 
 14: import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 15: 
 16: public class HibernateBaseDao<T, ID extends Serializable> extends
 17: 		HibernateDaoSupport {
 18: 	private Class<T> entityClass;
 19: 
 20: 	public HibernateBaseDao() {
 21: 		entityClass = ReflectionUtils.getSuperClassGenricType(getClass());
 22: 	}
 23: 
 24: 	public Query createQuery(final String queryString, final Object... values) {
 25: 		Query query = getSession().createQuery(queryString);
 26: 		if (values != null) {
 27: 			for (int i = 0; i < values.length; i++) {
 28: 				query.setParameter(i, values[i]);
 29: 			}
 30: 		}
 31: 		return query;
 32: 	}
 33: 
 34: 	public T findUnique(final String hql, final Object... values) {
 35: 		return (T) createQuery(hql, values).uniqueResult();
 36: 	}
 37: 	/**
 38: 	 * 按HQL分页查询.
 39: 	 * 
 40: 	 * @param page
 41: 	 *            分页参数.不支持其中的orderBy参数.
 42: 	 * @param hql
 43: 	 *            hql语句.
 44: 	 * @param values
 45: 	 *            数量可变的查询参数,按顺序绑定.
 46: 	 * 
 47: 	 * @return 分页查询结果, 附带结果列表及所有查询时的参数.
 48: 	 */
 49: 	@SuppressWarnings("unchecked")
 50: 	public Page<T> findPage(final Page<T> page, final String hql,
 51: 			final Object... values) {
 52: 		Query q = createQuery(hql, values);
 53: 
 54: 		long totalCount = countHqlResult(hql, values);
 55: 		page.setTotalCount(totalCount);
 56: 
 57: 		setPageParameter(q, page);
 58: 		List result = q.list();
 59: 		page.setResult(result);
 60: 		return page;
 61: 	}
 62: 	
 63: 	/**
 64: 	 * 设置分页参数到Query对象,辅助函数.
 65: 	 */
 66: 	protected Query setPageParameter(final Query q, final Page<T> page) {
 67: 		//hibernate的firstResult的序号从0开始
 68: 		q.setFirstResult(page.getFirst() - 1);
 69: 		q.setMaxResults(page.getPageSize());
 70: 		return q;
 71: 	}
 72: 
 73: 	/**
 74: 	 * 执行count查询获得本次Hql查询所能获得的对象总数.
 75: 	 */
 76: 	protected long countHqlResult(final String hql, final Object... values) {
 77: 		Long count = 0L;
 78: 		String fromHql = hql;
 79: 		//select子句与order by子句会影响count查询,进行排除.
 80: 		fromHql = "from " + StringUtils.substringAfter(fromHql, "from");
 81: 		fromHql = StringUtils.substringBefore(fromHql, "order by");
 82: 
 83: 		String countHql = "select count(*) " + fromHql;
 84: 
 85: 		try {
 86: 			count = (Long)findUnique(countHql, values);
 87: 		} catch (Exception e) {
 88: 			e.printStackTrace();
 89: 		}
 90: 		return count;
 91: 	}
 92: }
 93: 

第四步:在service中进行查询

从Action中传过page来

  1: public Page<User> getAllUserForPage(Page<User> page)
  2: 	{
  3: 		return userDao.findPage(page, "from User u order by u.id ");
  4: 	}
posted @ 2014-04-15 10:54  疯狂馒头  阅读(876)  评论(0编辑  收藏  举报