浏览 4300 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-20
我的想法是: 1.做一个比较通用的查询功能,比如设计一个参数类,查询条件通过这个参数类传递到dao层。dao负责解析; 2.就是dao层穷举这些所有可能的组合,分别为每一个组合生成一个接口方法。 看到有人在Hibernate中是使用detachedCretira来实现的。在查询端构造好detachedCretira,然后传递到dao去查询。但是这种方法违背了分层思想,而且导致了系统对hibernate的依赖。 不知道有没有更好的方法? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 仔细看看这篇文章,你会得到很好的启发! |
|
返回顶楼 | |
发表时间: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,我给你发送相关的源码。 |
|
返回顶楼 | |