六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 38|回复: 0

Hiberante 查询分页问题

[复制链接]

升级  92%

10

主题

10

主题

10

主题

童生

Rank: 1

积分
46
 楼主| 发表于 2013-1-27 05:15:36 | 显示全部楼层 |阅读模式
    关注Javaeye好久时间了,从来都没有发表过贴子,这次遇到一个问题,想跟圈子里的朋友交流一下!
我在用Hibernate进行分页处理时,通常会用到两条HQL的语句:
1、统计结果集的总数量:select count(*) as b from User as u
2、查询结果:from User as u
 
第一条HQL语句通常可以通过第二条HQL自动生成,这样就可以将一般分页的数据访问进行封装起来,大至情况如下:
public Page pagedQuery(String hql, int pageNo, int pageSize,   Object... values){  ......  List countlist = this.find(counthql, values);  int totalCount = ((Long) countlist.get(0)).intValue();  if (totalCount < 1)   return new Page();  // 实际查询返回分页对象  int startIndex = Page.getStartOfPage(pageNo, pageSize);  Query query = createQuery(resulthql, values);  //新加入设置查询缓存  query.setCacheable(true);  List list = query.setFirstResult(startIndex).setMaxResults(pageSize)    .list();  return new Page(startIndex, totalCount, pageSize, list);  } 
上边的封装在一般的情况下是很好用的,但最情我的同事有一个需求要:对数据分组后再进行分页。
HQL如下,我并没有写完整:select u.status from User as u group by u.status
他在调用pagedQuery方法得到的结果中并不如我所想想,分析原因,结果是这样的。
 数据如下:
     ID LOGIN_ID        PASSWORD      STATUS    ------- --------------- -----------------------       5 admin4          admin4         2              3 admin3          admin3         2              2 admin2          admin2         1              1 admin1          admin1         1              9 admin8          admin8         4              7 admin6          admin6         3              6 admin5          admin5         3              8 admin7          admin7         3              4 admin           21232F297A5    1         
 原HQL是:
  
select u.status,count(u.id) from User as u group by u.status order by count(u.id) desc  自动处理后的统计数量的HQL:
  
select count(*) as b from User as u group by u.status 
 由于自动生成统计数量的HQL本意是查询出分组后的结果集量数:
  B ----------  9 
 但是查询结果为
      B ----------         3         3         2         1 
  原因就是自动生成统计数量的HQL中的Count(*)计数是针对分组出现的。
  左想右想,还是要借鉴SQL中的子查询结果当表或者视图处理
  原SQL语句: 
 
select count(*) as b from SYS_USERS  u group by u.status; 
  数量统计SQL:
 
select count(*) as c from (select count(*) as b from SYS_UserS  u group by u.status)  d ;   
  我测试是可以统计数量的:
  
  C  ----------  4   于是我改变自动生成的数量统计HQL方法,想通过如下的方式实现
  原HQL是:
  
select u.status,count(u.id) from User as u group by u.status order by count(u.id) desc 
  自动处理后的统计数量的HQL:
  
select count(c.status) as b from (select u.status,count(u.id)  from User as u group by u.status) as c  
  
  测试是Hibernate并不支持这样的写法,我估计是HQL中Form后面的子句中不能出现子查询的原因引起的,但是我没有找到好的解决方法
 
 
  我想是可能通过Hibernate的API扩展达到目的,但是对HIbernate的底层不是非常熟,水平有限,没有搞定,正在努力中。。。
 
  请JavaEye中的各位高人帮助,看看能不能找到好的解决方法可以使得Hibernate支持。
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表