论坛首页 Java企业应用论坛

一个通用分页查询方法

浏览 8162 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-08-08   最后修改:2009-08-08
为了简化开发人员的代码,想写一个通用的分页查询方法,为了提交效率,其中有一段是分解hql语句,组成查询总数的hql语句,实现如下:
	public PaginationSupport findPageByQuery(final String hsql,final Object[] values,
			final int pageSize, final int startIndex) {
		return (PaginationSupport) getHibernateTemplate().execute(
				new HibernateCallback() {
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						String totalSql=null;
						if(hsql.toUpperCase().indexOf("SELECT")==-1)
							totalSql="SELECT COUNT(*) "+hsql.split("order by")[0].split("ORDER BY")[0];
						else if(hsql.toUpperCase().split("SELECT").length==2){
							totalSql=hsql.split("order by")[0].split("ORDER BY")[0];
							String[] tt=totalSql.split(" ");
							String colStr="",subStr="";int flag=1;
							for(int i=0;i<tt.length;i++){
								if(tt[i].equalsIgnoreCase("select"))continue;
								else if(tt[i].equalsIgnoreCase("from")){flag=2; continue;}
								else if(flag==1)colStr+=" "+tt[i];
								else subStr+=" "+tt[i];
							}
							totalSql="SELECT COUNT("+colStr.split(",")[0]+") FROM "+subStr;
						}
						Query totalQuery=null;
						if(totalSql!=null){
							totalQuery=session.createQuery(totalSql);
						}
						Query query = session.createQuery(hsql);
						if (values != null) {
	                        for (int i = 0; i < values.length; i++) {
	                        	if(totalQuery!=null) totalQuery.setParameter(i, values[i]);	                        	query.setParameter(i, values[i]);
	                        }
	                    }
						int totalCount=-1;
						if(totalQuery==null){
							if(pageSize>0)totalCount=query.list().size();
						}else{
							Object o=totalQuery.list().get(0);
							totalCount = (o==null?0:Integer.parseInt(o+""));
						}						if(startIndex>0) query.setFirstResult(startIndex);
						if(pageSize>0) query.setMaxResults(pageSize);

						List items = query.list();
						if(totalCount==-1) totalCount=items.size();
						PaginationSupport ps = new PaginationSupport(items,
								totalCount, pageSize, startIndex);
						return ps;

					}
				}, true);
	}



但是,在这个统计总数的hql会有问题,当数据表的主键包含多个字段的时候,最后生成的sql会变成count(pid,did),这样就会导致错误,如果有distinct时会更复杂,count(distinct pid,did),现在我只能添加个try,出现异常时调用query.list().size()去获取总数
对于通用的分页查询方法各位有什么好办法?
   发表时间:2009-08-08  
既然用hql还分解什么hql语句。明明就有现成的方法
0 请登录后投票
   发表时间:2009-08-10  
浪费手续。就这样个方法还通用?个人认为最好的办法就是建立一个Page对象。有不明白的可以问。
0 请登录后投票
   发表时间:2009-08-10   最后修改:2009-08-10
统一取list.size()吧
0 请登录后投票
   发表时间:2009-08-11  
这样的分页没必要写啊
0 请登录后投票
   发表时间:2009-08-11  
  hq 还要自己写分页吗? 都提供了分页机制。
0 请登录后投票
   发表时间:2009-08-15  
jltest 写道
既然用hql还分解什么hql语句。明明就有现成的方法


可能你没看清我的主题,我的目的是“为了简化开发人员的代码”

也就是说开发人员作查询时只需要编写:
PaginationSupport findUser(){
  return findPageByQuery("from user",null,20,0);
}

就可以了,返回的是 PaginationSupport,里面封装了分页需要的数据,其中一项就是数据总数,所以要求对输入的hql语句作拆分
0 请登录后投票
   发表时间:2009-08-15  
flysunsystem 写道
浪费手续。就这样个方法还通用?个人认为最好的办法就是建立一个Page对象。有不明白的可以问。


可能你没看清我的主题,我的目的是“为了简化开发人员的代码”

也就是说开发人员作查询时只需要编写:
PaginationSupport findUser(){
  return findPageByQuery("from user",null,20,0);
}

就可以了,返回的是 PaginationSupport就是你说的一个Page对象,里面封装了分页需要的数据,其中一项就是数据总数,所以要求对输入的hql语句作拆分

另外,应该你有不明白的可以问~~
0 请登录后投票
   发表时间:2009-08-15  
sjynt131 写道
统一取list.size()吧


从后台输出的sql语句看这样其实是作了一次查询所有记录的操作,比较耗资源;我的想法是改为count效率会高很多
0 请登录后投票
   发表时间:2009-08-15  
317082755 写道
这样的分页没必要写啊


可能你没看清我的主题,我的目的是“为了简化开发人员的代码”

也就是说开发人员作查询时只需要编写:
PaginationSupport findUser(){
  return findPageByQuery("from user",null,20,0);
}
就可以了,返回的是 PaginationSupport,里面封装了分页需要的数据,其中一项就是数据总数,所以要求对输入的hql语句作拆分
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics