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> extends17: 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 page41: * 分页参数.不支持其中的orderBy参数.42: * @param hql43: * hql语句.44: * @param values45: * 数量可变的查询参数,按顺序绑定.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: }