论坛首页 Java企业应用论坛

关于使用Hibernate的任意条件组合查询的实现

浏览 4300 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-20  
其实没有用orm之前,如果系统分层比较彻底的话,也同样有这个问题。我们崇尚service层不包含数据访问的东西,包括sql语句等。这些都应该是dao层实现。但是很多查询功能都需要能够多条件任意组合查询。这个时候数dao层应该如何支撑?

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

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

不知道有没有更好的方法?
   发表时间: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
仔细看看这篇文章,你会得到很好的启发!
0 请登录后投票
   发表时间: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,我给你发送相关的源码。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics