`
power1128
  • 浏览: 24405 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Hibernate查询方式的使用场合

阅读更多

今天读了一篇不错的文章,主要比较了Hibernate中几种查询方式的适用场合。通过实际的代码示例,得出了一个简单的结论,就是Criteria非常使用页面级的动态查询;HQL适合于固定的有业务含义的查询,并且最好使用hibernate的静态查询约定,写到映射文件中去。

以前我不喜欢使用这种静态查询,因为我改一个查询语句还要打开映射文件,不能直接在代码(DAO)中修改。不过随着项目规模的扩大,查询语句在代码中非常分散,难以做到集中管理或者审查,才发现使用静态查询的好处。因为所有查询语句是在影射文件中(xml),因此可以使用一些文件处理工具生成目前所有的HQL。

最后我的观点是,在表现层统一使用Criteria;DAO层统一使用静态查询。当然也是尽量。大家如果有什么看法请给我留言,欢迎讨论!


参考链接:http://www.javalobby.org/articles/hibernatequery102/


2012-01-31 补充:


继续前面的结论。昨天和涛-哥讨论了一下,是否在Action里直接使用Criteria的问题,获益匪浅。


首先,我原来的观点是,由用户动态定义条件的查询(下文简称动态查询。比如用户输入车辆牌照,查询车辆信息),应该放在Action中处理,生成查询语句(使用Criteria还是HQL只是形式问题)。我的理由是:

1.这样最简单,好修改;

2. 动态查询一般限定于特定的页面(即处理也限定于特定的action),不会存在复用等问题;

实现方式如下图:

		DetachedCriteria criteria = DetachedCriteria.forClass(CYDO.class);
		if (StringUtils.isNotEmpty(lineCode)) {
			criteria.add(Restrictions.eq("lineCode", this.lineCode));
		}
		if (StringUtils.isNotEmpty(this.id)) {
			criteria.add(Restrictions.idEq(this.id));
		}
		criteria.add(Restrictions.eq("status", CYDO.STATUS_UN_DISPATCH));
		return cyDOService.dynamicQuery(criteria,
				this.newPaginationCriterion(), this.newOrderByCriterion());
 


但是讨论后,确实发现存在不少问题:

1. 在表现层引入了Hibernate的依赖(如果采用Criteria);

2. 表现层出现了查询逻辑。即表现层程序员还要了解系统结构,知道如何才能查询出结果;

3. 查询逻辑的分散。替换DAO并不能保证所有数据库操作被替换。从而使得DAO模式丧失了意义。


最后的结论是:所有查询都应该在DAO中定义。即使这样会导致很多查询方法的定义。

比如一个页面需要根据车辆牌照查询车辆,另一个页面需要根据司机查询车辆。那么我们需要两个DAO查询接口。这样,Action代码中只有调用相关查询接口的操作,不会存在查询语句的生成和拼装。

分享到:
评论

相关推荐

    Eclipse中Hibernate简单配置和使用

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Hibernate...

    Hibernate_QBC和Hibernate_QBE

    在实际开发中,开发者通常需要了解这些接口和类的使用方式以及它们如何与Hibernate的Session对象交互来执行查询。 **工具应用** 在使用Hibernate时,开发者可能会借助IDE(如Eclipse、IntelliJ IDEA)中的插件或...

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...

    Hibernate查询 load与get的区别及其它查询测试

    在Java的持久化框架Hibernate中,数据访问是通过对象关系映射(ORM)来实现的。`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是...理解这些方法的区别和使用场合是优化Hibernate应用性能的关键。

    hibernate4.3完整jar包

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate的...

    hibernate的jar

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

    传智播客李勇hibernate

    - Hibernate可以作为JPA的实现,使用注解方式进行编程。 14. **最佳实践**: - 合理设计对象模型,避免过度使用关联。 - 根据项目需求选择合适的缓存策略。 - 适当使用HQL/Criteria,避免过多的SQL直接操作。 ...

    Hibernate 概述

    Hibernate 可用于任何 JDBC 可以使用的场合,例如 Java 应用程序的数据库访问代码、DAO 接口的实现类等。 2. **兼容性和灵活性**:Hibernate 与 JDBC 密切关联,因此 Hibernate 的兼容性与 JDBC 驱动和数据库有...

    hibernate需要的最小jar包

    Hibernate可以应用在任何使用JDBC的场合,既可以 在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在 应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

    Hibernate2.1.2参考手册中文版

    6. **Criteria查询**:Hibernate提供了Criteria API,一种面向对象的查询方式,可以动态构建SQL查询,避免硬编码SQL,提高代码可读性和可维护性。 7. **HQL(Hibernate Query Language)**:Hibernate特有的查询...

    jdbc和hibernate的区别

    1. **SQL语言**:JDBC直接使用标准SQL与数据库通信,而Hibernate则使用HQL(Hibernate Query Language),一种面向对象的查询语言,更贴近Java代码。 2. **操作对象**:JDBC操作的是数据,需要手动编写SQL语句,而...

    hibernate资源框架

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

    Hibernate-5-教程 详细教程 225页

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

    Hibernate 中文api文档下载 .zip

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC... Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。CHM格式,不用安装阅读软件,可以直接打开。

    hibernate5相关jar包

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。

    hibernate-release-5.4.9.Final.zip

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。

    Hibernate+EhCache配置及使用说明详解

    1. 当用 Hibernate 的方式修改表数据(save,update,delete 等等),这时 EhCache 会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但 对于数据经常修改的表来说,可能就失去缓存的意义了(不能减轻数据库...

Global site tag (gtag.js) - Google Analytics