读书人

关于施用Hibernate的任意条件组合查询

发布时间: 2012-10-27 10:42:25 作者: rapoo

关于使用Hibernate的任意条件组合查询的实现
其实没有用orm之前,如果系统分层比较彻底的话,也同样有这个问题。我们崇尚service层不包含数据访问的东西,包括sql语句等。这些都应该是dao层实现。但是很多查询功能都需要能够多条件任意组合查询。这个时候数dao层应该如何支撑?

我的想法是:
1.做一个比较通用的查询功能,比如设计一个参数类,查询条件通过这个参数类传递到dao层。dao负责解析;
2.就是dao层穷举这些所有可能的组合,分别为每一个组合生成一个接口方法。

看到有人在Hibernate中是使用detachedCretira来实现的。在查询端构造好detachedCretira,然后传递到dao去查询。但是这种方法违背了分层思想,而且导致了系统对hibernate的依赖。

不知道有没有更好的方法? 1 楼 rasonyang 2007-08-21 采用Generic DAO设计模式。参见:http://www.ibm.com/developerworks/java/library/j-genericdao.html
中文翻译:
http://www.ibm.com/developerworks/cn/java/j-genericdao.html
仔细看看这篇文章,你会得到很好的启发! 2 楼 rasonyang 2007-08-21 通用的查询可以采用DSL Criteria Style api。Hibernate的Criteria做得并不好。比如
1 简单的
List users = GenericDAO.find(User.class,"groups:g.name","开发部")
2 复杂的
Criterion criterion = Criterions.select(distinct(),count(),"g.name")
.and(
in("groups:g.name", "开发部","测试部","人事部","行政部门").eq("roles::r.name", "admin")
).or(
eq("disable", true).gt("menus.m",1)
)
.group("g.name")
.having(gt(count(),1))
.order(asc("createtime"));

//这个只是例子,
List users = GenericDAO.find(User.class,criterion)

3介绍以下:
3.1、"groups:g.name"是用户和部门内连接,g是部门的别名,g.name是部门的name属性
3.2、"roles::r.name"是用户和角色左连接,r是角色的别名,r.name是角色的name属性
3.3、目前只支持内连接和左外连接,其他连接在实际应用中一般极少用到.如果碰到这种情况,你可以试试去买彩票了。
3.4、如果没有select方法,那么就是select *。and、in、or 、eq、gt、group、having、order都可以没有,根据情况而定。
3.5、支持eq、ne、le、ge、gt、lt、between、in、like、ilike等操作。

4 支持QBE
User user = new User();
List<User> Users = UserDao.find(like(User).excludeProperty("name"));

5 支持智能行数计算
count(criterion),具体做法就是去掉group和order,
然后在select count(o) from (去掉group和order的JPA QL) o。
如果需要,留下您的MSN,我给你发送相关的源码。

读书人网 >软件架构设计

热点推荐