在通用的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;
}
}
在类上都使用了泛型,这样才能作为可以被复用的类。