关注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支持。
分享到:
相关推荐
描述中的“Hiberante3_HQL”提示我们将会涉及到Hibernate查询语言(HQL),它是面向对象的查询语言,允许开发者以类和对象的方式查询数据库。 “Hibernate3_缓存机制”意味着这部分内容将深入探讨Hibernate如何通过...
// 使用Hibernate查询并分页 // ... return "success"; } } ``` 在Struts2的配置文件中,我们需要为这个Action添加相应的配置,以便于处理请求。 ```xml <result name="success">/pagination.jsp ``` **三...
两者都允许执行复杂的查询,包括分页、排序和关联查询。 五、缓存机制 为了提高性能,Hibernate引入了缓存机制。一级缓存是Session级别的,所有在Session内的操作都会缓存结果,提高读写效率。二级缓存则是...
这两种查询语言支持复杂的查询条件、关联查询和分页等操作。 6. **事务管理** Hibernate支持编程式和声明式事务管理。编程式事务管理通过SessionFactory的Transaction接口手动开启和提交事务;声明式事务管理则...
这个小项目使用jsf+richfaces+hiberante设计,作为学习jsf和hibernate的新手学习参考.里面由基本上有常规项目所需一般功能:比如ajax.分页.hibernate级联操作等等
如果只需要获取部分关联数据,可以考虑使用懒加载(lazy loading)或分页查询(pagination)来避免大数据量的加载。 总的来说,Hibernate的一对多关联更新涉及到实体关系的配置、级联操作的理解以及性能优化等多个...
5. 查询(Query):通过HQL或Criteria API进行复杂查询,支持分页、排序、关联查询等。 六、关联映射 Hibernate支持多种关联映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多...
使用flex+spring+hibernate 数据库mysql 主要功能添加、分页查询、批量更新、批量删除 数据库由hibernate自动创建(需修改hiberante配置) 下载后评论加1分记得评级
系统精小化,安装包约50M,方便下载.2)改进蓝色默认模板,增加新UI.3)重构util/sucrity,统计,hibernate管理,分页等组件.4)改进安装包5)数据库独立发行,同时进一步精减.6)采用新APP打包机制,库,WEB,SRC分开打包,降低下载...
以前学的Java进行开发,多用到Mybatis,Hiberante等ORM框架,最近需要上手一个C#的项目,由于不是特别难,也不想再去学习C#的ORM框架,所以就想着用反射简单的实现一下ORM框架的内容,简单的增删改查,没有用到多表...
### Struts2 + Hibernate + 单表的增删改查 #### 一、概述 在当前的软件开发领域,特别是企业级应用开发中,MVC(Model-...在实际开发中,还可以进一步扩展,例如加入分页查询、条件筛选等功能,以满足更复杂的需求。