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: else112: 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: else129: 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: }

浙公网安备 33010602011771号