对分页步骤的一个多层的封装

对分页方法的一个多层的封装
//下面是对一个分页方法的封装,考虑了客户端调用的时候的多种传递参数的情况,其实在开发过程总没有必要提供那么多的接口,一切以需求为基准无论因为参数的个数或类型进行怎么的封装真正的代码实现只有一份(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();
	}