package com.bjsxt.oa.manager.impl;
import java.util.List;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.bjsxt.oa.PageModel;
import com.bjsxt.oa.SystemContext;
import com.bjsxt.oa.manager.SystemException;
/**
* 抽象的公共分页类
* @author lilongsheng
*
*/
public class AbstractManager extends HibernateDaoSupport {
/**
* 带hql查询语句的查询方法
* @param hql
* @return
*/
public PageModel searchPaginated(String hql){
return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
}
/**
* 带hql查询语句和一个参数的方法
* @param hql
* @param param
* @return
*/
public PageModel searchPaginated(String hql,Object param){
return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
}
/**
* 带hql查询语句和若干参数的方法
* @param hql
* @param params
* @return
*/
public PageModel searchPaginated(String hql,Object[] params){
return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());
}
/**
* 不带参数的查询语句
* @param hql
* @param offset
* @param pagesize
* @return
*/
public PageModel searchPaginated(String hql,int offset,int pagesize){
return searchPaginated(hql,null, offset, pagesize);
}
/**
*
* 带一个参数的分页查询
*/
public PageModel searchPaginated(String hql,Object obj,int offset,int pagesize){
return searchPaginated(hql, new Object[]{obj}, offset, pagesize);
}
/**
* 根据HQL语句进行分页查询
* @param hql HQL语句
* @param params HQL语句带的多个参数值
* @param offset 从第几条记录开始查询
* @param pagesize 每页显示多少行
* @return
*/
public PageModel searchPaginated(String hql,Object[] params,int offset,int pagesize){
//获取记录总数
String countHql=getCountQuery(hql);
Query query=getSession().createQuery(countHql);
if (params!=null && params.length>0) {
for(int i=0;i<params.length;i++){
query.setParameter(i, params[i]);
}
}
int total=((Long)query.uniqueResult()).intValue();
//获得记录结果集
query = getSession().createQuery(hql);
if(params != null && params.length > 0){
for(int i=0; i<params.length; i++){
query.setParameter(i, params[i]);
}
}
List datas=query.setFirstResult(offset)
.setMaxResults(pagesize)
.list();
PageModel pm=new PageModel();
pm.setTotal(total);
pm.setDatas(datas);
return pm;
}
/**
* 根据HQL语句,获得查找总记录数的HQL语句
* 如:
* select ... from Orgnization o where o.parent is null
* 经过转换,可以得到:
* select count(*) from Orgnization o where o.parent is null
* @param hql
* @return
*/
private String getCountQuery(String hql){
int index=hql.indexOf("from");
if (index!=-1) {
return "select count(*) "+ hql.substring(index);
}
throw new SystemException("无效的HQL查询语句!");
}
}