今天读了一篇不错的文章,主要比较了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代码中只有调用相关查询接口的操作,不会存在查询语句的生成和拼装。
分享到:
相关推荐
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Hibernate...
在实际开发中,开发者通常需要了解这些接口和类的使用方式以及它们如何与Hibernate的Session对象交互来执行查询。 **工具应用** 在使用Hibernate时,开发者可能会借助IDE(如Eclipse、IntelliJ IDEA)中的插件或...
在Java的持久化框架Hibernate中,数据访问是通过对象关系映射(ORM)来实现的。`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是...理解这些方法的区别和使用场合是优化Hibernate应用性能的关键。
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可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate的...
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
- Hibernate可以作为JPA的实现,使用注解方式进行编程。 14. **最佳实践**: - 合理设计对象模型,避免过度使用关联。 - 根据项目需求选择合适的缓存策略。 - 适当使用HQL/Criteria,避免过多的SQL直接操作。 ...
Hibernate 可用于任何 JDBC 可以使用的场合,例如 Java 应用程序的数据库访问代码、DAO 接口的实现类等。 2. **兼容性和灵活性**:Hibernate 与 JDBC 密切关联,因此 Hibernate 的兼容性与 JDBC 驱动和数据库有...
Hibernate可以应用在任何使用JDBC的场合,既可以 在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在 应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
6. **Criteria查询**:Hibernate提供了Criteria API,一种面向对象的查询方式,可以动态构建SQL查询,避免硬编码SQL,提高代码可读性和可维护性。 7. **HQL(Hibernate Query Language)**:Hibernate特有的查询...
1. **SQL语言**:JDBC直接使用标准SQL与数据库通信,而Hibernate则使用HQL(Hibernate Query Language),一种面向对象的查询语言,更贴近Java代码。 2. **操作对象**:JDBC操作的是数据,需要手动编写SQL语句,而...
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC... Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。CHM格式,不用安装阅读软件,可以直接打开。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。
1. 当用 Hibernate 的方式修改表数据(save,update,delete 等等),这时 EhCache 会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但 对于数据经常修改的表来说,可能就失去缓存的意义了(不能减轻数据库...