对分页方法的一个多层的封装


//下面是对一个分页方法的封装,考虑了客户端调用的时候的多种传递参数的情况,其实在开发过程总没有必要提供那么多的接口,一切以需求为基准无论因为参数的个数或类型进行怎么的封装真正的代码实现只有一份(MyThreadLocal是一个绑定了分页数据的ThreadLocal)
/**
* 直传一条hql语句
* @param hql
* @return
*/
@SuppressWarnings("unchecked")
public PageModel searchEncapsulation(String hql){
return this.searchEncapsulation(hql,null);
}

/**
* 如果hql中需要设置一个参数,则需要传递参数
* @param hql
* @param params
* @return
*/
public PageModel searchEncapsulation(String hql, Object params){
return this.searchEncapsulation(hql,new Object[]{params});
}

/**
* 如果hql中需要设置多个参数,则需要传递参数
* @param hql
* @param params
* @return
*/
public PageModel searchEncapsulation(String hql, Object[] params){
return this.searchEncapsulation(hql,params,MyThreadLocal.getValue().getOffset(),MyThreadLocal.getValue().getPageSize());
}

/**
* 如果hql中需要设置一个参数,并且你的这个方法要支持分页,要把分页需要的数据传过来
* @param hql
* @param param
* @param offset
* @param pageSize
* @return
*/
public PageModel searchEncapsulation(String hql,Object param, int offset, int pageSize){
return this.searchEncapsulation(hql,new Object[]{param} ,MyThreadLocal.getValue().getOffset(),MyThreadLocal.getValue().getPageSize());
}

/**
* 如果hql语句不需要参数,但是要求支持分页
* @param hql
* @param offset
* @param pageSize
* @return
*/
public PageModel searchEncapsulation(String hql,int offset, int pageSize ){
return this.searchEncapsulation(hql,null,offset, pageSize);
}

/**
* 最终实现:一个Service或者Interface可以向外提供过个不同的参数个数或者类别的方法,但是真正的代码实现只需要一份
* @param dataHql
* @param params
* @param offset
* @param pageSize
* @return
*/
@SuppressWarnings("unchecked")
public PageModel searchEncapsulation(String dataHql,Object[] params, int offset, int pageSize){
//查询总记录数
String countHql = getCountHql(dataHql);
Query query = this.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();
List<Organization> datas = this.getSession().createQuery(dataHql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
PageModel pm = new PageModel();
pm.setTotal(total);
pm.setDatas(datas);
//查询数据
return pm;
}

public String getCountHql(String hql) {
//这个地方有个小bug,没有考虑到From大小写的问题
int index = hql.indexOf("from");
if(index != -1) {
hql = "select count(*) " + hql.substring(index);
return hql;
}
throw new RuntimeException();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值