2007-08-20
关于使用Hibernate的任意条件组合查询的实现
其实没有用orm之前,如果系统分层比较彻底的话,也同样有这个问题。我们崇尚service层不包含数据访问的东西,包括sql语句等。这些都应该是dao层实现。但是很多查询功能都需要能够多条件任意组合查询。这个时候数dao层应该如何支撑?
我的想法是:
1.做一个比较通用的查询功能,比如设计一个参数类,查询条件通过这个参数类传递到dao层。dao负责解析;
2.就是dao层穷举这些所有可能的组合,分别为每一个组合生成一个接口方法。
看到有人在Hibernate中是使用detachedCretira来实现的。在查询端构造好detachedCretira,然后传递到dao去查询。但是这种方法违背了分层思想,而且导致了系统对hibernate的依赖。
不知道有没有更好的方法?
我的想法是:
1.做一个比较通用的查询功能,比如设计一个参数类,查询条件通过这个参数类传递到dao层。dao负责解析;
2.就是dao层穷举这些所有可能的组合,分别为每一个组合生成一个接口方法。
看到有人在Hibernate中是使用detachedCretira来实现的。在查询端构造好detachedCretira,然后传递到dao去查询。但是这种方法违背了分层思想,而且导致了系统对hibernate的依赖。
不知道有没有更好的方法?
评论
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,我给你发送相关的源码。
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,我给你发送相关的源码。
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
仔细看看这篇文章,你会得到很好的启发!
中文翻译:
http://www.ibm.com/developerworks/cn/java/j-genericdao.html
仔细看看这篇文章,你会得到很好的启发!
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 1183 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
一个现有EJB系统的性能优 ...
你提到查询过程性能问题严重,请问这种查询的结果是否还要做为业务处理的输入?还是只 ...
-- by movingboy -
一个现有EJB系统的性能优 ...
Lucas Lee 写道你的优化方法只是泛泛的方向,没有结合具体实际来考虑是否合 ...
-- by wczwcg -
一个现有EJB系统的性能优 ...
升级硬件比动软件更划算
-- by feedss -
一个现有EJB系统的性能优 ...
你的优化方法只是泛泛的方向,没有结合具体实际来考虑是否合适。首先你得找到瓶颈。数 ...
-- by Lucas Lee -
Color uml 与 DDD
tuti 写道画Color Uml的过程不就是分析吗? 我的理解中这个分析是基 ...
-- by wczwcg






评论排行榜