锁定老帖子 主题:一个通用分页查询方法
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-08
最后修改:2009-08-08
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()去获取总数 对于通用的分页查询方法各位有什么好办法? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-08
既然用hql还分解什么hql语句。明明就有现成的方法
|
|
返回顶楼 | |
发表时间:2009-08-10
浪费手续。就这样个方法还通用?个人认为最好的办法就是建立一个Page对象。有不明白的可以问。
|
|
返回顶楼 | |
发表时间:2009-08-10
最后修改:2009-08-10
统一取list.size()吧
|
|
返回顶楼 | |
发表时间:2009-08-11
这样的分页没必要写啊
|
|
返回顶楼 | |
发表时间:2009-08-11
hq 还要自己写分页吗? 都提供了分页机制。
|
|
返回顶楼 | |
发表时间:2009-08-15
jltest 写道 既然用hql还分解什么hql语句。明明就有现成的方法
可能你没看清我的主题,我的目的是“为了简化开发人员的代码” 也就是说开发人员作查询时只需要编写: PaginationSupport findUser(){ return findPageByQuery("from user",null,20,0); } 就可以了,返回的是 PaginationSupport,里面封装了分页需要的数据,其中一项就是数据总数,所以要求对输入的hql语句作拆分 |
|
返回顶楼 | |
发表时间:2009-08-15
flysunsystem 写道 浪费手续。就这样个方法还通用?个人认为最好的办法就是建立一个Page对象。有不明白的可以问。
可能你没看清我的主题,我的目的是“为了简化开发人员的代码” 也就是说开发人员作查询时只需要编写: PaginationSupport findUser(){ return findPageByQuery("from user",null,20,0); } 就可以了,返回的是 PaginationSupport就是你说的一个Page对象,里面封装了分页需要的数据,其中一项就是数据总数,所以要求对输入的hql语句作拆分 另外,应该你有不明白的可以问~~ |
|
返回顶楼 | |
发表时间:2009-08-15
sjynt131 写道 统一取list.size()吧
从后台输出的sql语句看这样其实是作了一次查询所有记录的操作,比较耗资源;我的想法是改为count效率会高很多 |
|
返回顶楼 | |
发表时间:2009-08-15
317082755 写道 这样的分页没必要写啊
可能你没看清我的主题,我的目的是“为了简化开发人员的代码” 也就是说开发人员作查询时只需要编写: PaginationSupport findUser(){ return findPageByQuery("from user",null,20,0); } 就可以了,返回的是 PaginationSupport,里面封装了分页需要的数据,其中一项就是数据总数,所以要求对输入的hql语句作拆分 |
|
返回顶楼 | |