第一步:新建一个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: }