`
wczwcg
  • 浏览: 7943 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

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

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

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

不知道有没有更好的方法?
分享到:
评论
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,我给你发送相关的源码。
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
仔细看看这篇文章,你会得到很好的启发!

相关推荐

    Hibernate-Criteria 模糊查询

    1. **条件组合**:你可以使用`Expression`的`and`或`or`方法来组合多个查询条件,以满足更为复杂的查询逻辑。 ```java Expression expr1 = Restrictions.eq("name", "Erica"); Expression expr2 = Restrictions...

    hibernate的HQL的模糊查询

    4. **使用`or`和`and`组合**:可以使用逻辑运算符`or`和`and`组合不同条件。例如,查询名字以"张"开头并且城市为"北京"的用户: ```java String hql = "from User u where u.username like :name and u.city = :...

    hibernate查询

    这里使用了 `Restrictions.like` 方法来实现模糊匹配,`MatchMode.ANYWHERE` 参数表示匹配字符串中的任意位置。 #### 四、QBE 查询 QBE 查询是一种基于示例对象来进行查询的方式,它允许开发者使用一个已知的对象...

    Hibernate中文API大全

    当删除对象时, Hibernate必须使用每一个字段的值来确定一条记录(在组合元素表中,没有单独的关键字段), 如果有为null的字段,这样做就不可能了。你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么...

    Hibernate 练习题

    2. **QBC查询方式**:Query By Criteria,通过标准接口创建查询,适用于复杂的条件组合。 3. **本地SQL查询方式**:直接使用数据库特定的SQL语句进行查询,提供最大灵活性。 4. **OID查询方式**:Object Identifier...

    Hibernate_通用DAO模式,一个写好的dao层

    总的来说,这个资源为开发者提供了一个高效的工具,通过使用Hibernate和通用DAO模式,可以快速构建数据访问层,同时保持代码的整洁和可维护性。在开发Java Web应用程序时,正确理解和运用这种模式,能大大提高开发...

    hibernate jar包

    Hibernate是一个开源的对象...所有这些jar包组合在一起,构成了使用Hibernate进行数据库操作所需的完整环境。在使用过程中,通常会通过构建工具(如Maven或Gradle)来管理这些依赖,以确保版本兼容性并简化构建过程。

    SSH (hibernate +struts2 + spring)

    Hibernate支持多种数据库,具有丰富的查询API,包括HQL(Hibernate Query Language)和Criteria API,使得数据查询更加便捷和灵活。 在SSH整合中,这三层框架相互协作,实现了业务逻辑、控制流程和数据访问的有效...

    ssh框架的模糊查询

    SSH框架,全称为Struts2、Spring和Hibernate的集成,是Java Web开发中常用的一种开源框架组合。这个框架集合了Struts2的MVC设计模式、Spring的依赖注入(DI)以及事务管理、Hibernate的对象关系映射(ORM)功能,为...

    hibernate-search

    可以通过以下任意组合定义查询: “本地” Apache Lucene查询以Json格式编写“本机” Elasticsearch查询(如果使用Elasticsearch,这是可选的) 使用我们的DSL提取前两个生成最佳后端特定查询的DSL 查询结果可以...

    struts2.3.15.3-spring3.1.0-hibernate4.0.0 整合源码

    在这个整合项目中,我们看到的"struts2.3.15.3-spring3.1.0-hibernate4.0.0"是一个特定版本的组合,主要关注的是Struts2的安全更新。 **Struts2框架** 是一个基于MVC设计模式的Java Web应用程序框架,用于构建动态...

    MyEclipse完整工程SSH实现分页

    在IT行业中,SSH(Struts2、Spring、Hibernate)是一个非常流行的Java Web开发框架组合,用于构建高效、可维护的企业级应用。在这个"MyEclipse完整工程SSH实现分页"项目中,我们将深入探讨如何在SSH框架下实现数据的...

    ssh(struts、spring、hibernate)集成

    SSH(Struts、Spring、Hibernate)集成是Java Web开发中常用的一种框架组合,它整合了Struts的MVC设计模式、Spring的IoC(控制反转)/DI(依赖注入)以及Hibernate的对象关系映射功能,提供了高效且灵活的开发环境。...

    hibernate-generic-dao:自动从code.google.comphibernate-generic-dao导出

    将单个过滤器与逻辑运算符(AND,OR,NOT)的任意组合组合。 按属性排序。 分页。 从客户端代码远程定义搜索。 将搜索结果转换为对象,列表,数组和地图 指定要急切获取的关联。 指定列运算符,例如COUNT,SUM...

    HQL查询语言基础.

    **HQL查询语言基础** HQL(Hibernate Query Language)是Hibernate框架中用于操作对象关系映射(ORM)的查询语言,它与SQL类似,但专为...了解并熟练掌握HQL,对于使用Hibernate或其他类似的ORM框架进行开发至关重要。

    Eclipse搭建SSH框架开发学习笔记

    SSH框架是三个开源Java框架的组合,分别是Struts、Spring和Hibernate,它们常被用于构建企业级的Web应用程序。Struts作为MVC(Model-View-Controller)设计模式的实现,负责控制应用程序流程;Spring则提供了一个...

    SSH写的一个个人博客网站(h5)(附数据库表)

    SSH是一个经典的Java Web开发框架,由Struts、Spring和Hibernate三个开源项目组合而成。这个框架在2000年代中期非常流行,为开发者提供了一种高效、灵活的构建动态网站的方式。 1. **Struts**: Struts是MVC(Model-...

    getHibernateTemplate

    例如,以下代码展示了如何使用`HibernateCallback`来实现分页查询: ```java public List getListForPage(String hql, int offset, int length) { List list = getHibernateTemplate().executeFind(new ...

Global site tag (gtag.js) - Google Analytics