您的位置:首页 > 其它

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

2013-11-19 11:05 423 查看
在通用的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>
 */
@Transactional
public 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;
	}
}
在类上都使用了泛型,这样才能作为可以被复用的类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐