按照过滤条件、排序语句、起始位置和每页条数获取分页数据

来源:互联网 发布:美国私立高中 知乎 编辑:程序博客网 时间:2024/04/29 13:12

在通用的DAO中写一个通用的方法,可以让任意层的任意方法通过调用该方法来查询数据并且分页。

通用DAO接口:

package com.wcx.shop.dao;import java.io.Serializable;import java.util.LinkedHashMap;import java.util.List;import com.wcx.shop.utils.QueryResult;/** * 通用DAO接口 * @author Administrator * @param <T> */public interface ICommonDao<T> {QueryResult<T> findCollectionByConditionPaged(String condition, Object[] params,LinkedHashMap<String, String> orderBy, int startPos, int pageSize);}


实现类:
/** * 通用DAO实现类,为抽象,无法实例化 * @author Administrator * @param <T> */@Transactionalpublic abstract class CommonDaoImpl<T> implements ICommonDao<T> {private Class entityClass = GenericSuperClass.getActualTypeClass(this.getClass());//通过反射获取类实体/** * 按照一定的条件获取分页数据 * @param 过滤条件、过滤参数、排序条件、起始位置、每页数据条数 * @return QueryResult对象,存储总数据条数(long)和分页数据集合(list) */public QueryResult<T> findCollectionByConditionPaged(String condition,final Object[] params, LinkedHashMap<String, String> orderBy,final int startPos, final int pageSize) {final long[] totalNumber = new long[1];//因为final变量无法赋值,因此需要用数组或者集合来封装一下String hql = "from " + entityClass.getSimpleName() + " o where 1 = 1 ";String orderHql = orderByHql(orderBy);if(condition == null)condition = "";final String finalHql = hql + condition + orderHql;List<T> objectsList = (List<T>) hibernateTemplate.execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(finalHql);totalNumber[0] = query.list().size(); for(int i = 0; params != null && i < params.length; i++) {query.setParameter(i, params[i]);}return query.setFirstResult(startPos).setMaxResults(pageSize).list();}});QueryResult<T> qr = new QueryResult<T>();qr.setTotalNumber(totalNumber[0]);qr.setRecordList(objectsList);return qr;}}

其中,QueryResult为存放查询结果的类,有两个成员变量,如下:
import java.util.List;/** * 用来存放记录总数和分页查询列表两个结果的类 * @author Administrator * @param <T> */public class QueryResult<T> {/** 记录总数 */private long totalNumber;/** 分页查询记录集合 */private List<T> recordList;public long getTotalNumber() {return totalNumber;}public void setTotalNumber(long totalNumber) {this.totalNumber = totalNumber;}public List<T> getRecordList() {return recordList;}public void setRecordList(List<T> recordList) {this.recordList = recordList;}}
在类上都使用了泛型,这样才能作为可以被复用的类。



原创粉丝点击