最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。所以现在对 Hibernate 的 Criteria 深入研究一下。《 Hibernate Reference 》及网上其它一些资料对 Criteria 已经做了很多介绍。本文主要是从 Criteria 的结构入手来进行分析。
如图 1 。 Hibernate 设计了 CriteriaSpecification 作为 Criteria 的顶级接口,其下面提供了 Criteria 和 DetachedCriteria 。
Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需 Session , DetachedCriteria 提供了 4 个静态方法 forClass(Class) 或 forEntityName(Name) 进行 DetachedCriteria 实例的创建。 Spring 的框架提供了
getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据
DetachedCriteria 来返回查询结果。
如图 1 , Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式。对于 Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。
下面就对 Criterion 和 Projection 进行详细说明。
<v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" id="_x0000_t75"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>
图 1
<o:p> </o:p>
Criterion 是 Criteria 的查询条件。
Criteria 提供了 add(Criterion criterion) 方法来添加查询条件。图 2 是 Criterion 的结构图。 Criterion 接口的主要实现包括: Example 、 Junction 和 SimpleExpression 。而 Junction 的实际使用是它的两个子类 conjunction 和 disjunction ,分别是使用 AND 和 OR 操作符进行来联结查询条件集合。
Criterion 的实例可以通过 Restrictions 工具类来创建, Restrictions 提供了大量的静态方法,如 eq (等于)、 ge (大于等于)、 between 等来方法的创建 Criterion 查询条件
( SimpleExpression 实例)。除此之外, Restrictions 还提供了方法来创建 conjunction 和 disjunction 实例,通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合。
至于 Example 的创建有所不同, Example 本身提供了一个静态方法 create(Object entity) ,即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件:
Example exampleUser =Example.create(u)
.ignoreCase() // 忽略大小写
.enableLike(MatchMode.ANYWHERE);
// 对 String 类型的属性,无论在那里值在那里都匹配。相当于 %value%
图 2
Project 主要是让 Criteria 能够进行报表查询,并可以实现分组。 Project 主要有 SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 avg 、 count 、 max 、 min 、 sum 可以让开发者很容易对某个字段进行统计查询。
Property 是对某个字段进行查询条件的设置,如通过
Porperty.forName(“color”).in(new String[]{“black”,”red”,”write”}); 则可以创建一个 Project 实例。通过 criteria 的 add(Project) 方法加入到查询条件中去。
图 3
使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装,其结构层次如何。这样使用起来便可得心应手。
分享到:
相关推荐
《Hibernate深入研究之Criteria》 Hibernate作为Java领域中的一款强大持久化框架,极大地简化了数据库操作,使得开发者能够更加专注于业务逻辑,而非繁琐的SQL语句。本篇将重点探讨Hibernate中的Criteria API,这是...
本文档的主要目的是为了深入理解 Hibernate 的工作原理、特性和最佳实践,以及与其他ORM框架的比较,为开发者提供决策依据。 1.2 **文档范围** 文档覆盖了 Hibernate 的核心概念,如对象关系映射、持久化模型、事务...
**Hibernate 框架简介** Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式操作数据库,将...通过深入研究这个项目,开发者可以更好地理解如何在 Java 应用中高效地处理多表数据。
深入QBC查询.md可能涵盖了Hibernate的Query By Criteria API,这是另一种查询数据库的方式,除了传统的HQL(Hibernate Query Language)外,开发者可以通过构建Criteria对象来执行动态查询,这种方式更接近面向对象...
这份史上最全的Hibernate教程,旨在帮助新手快速入门并掌握Hibernate的核心概念和使用技巧,同时也为有经验的开发者提供了深入研究的素材。通过系统学习,开发者不仅能提升数据库操作的效率,还能更好地理解和应用...
通过深入研究《Hibernate Quickly 源代码》,开发者可以全面掌握Hibernate框架的使用,提高开发效率,同时也能了解到实际项目中如何解决常见的持久化问题。这是一份非常有价值的资源,对于想要提升Java数据库编程...
学习完基础后,可深入研究Hibernate的高级特性,如 Criteria API、Hibernate Search 和 JPA 规范等。 总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。...
通过深入研究 Spring 和 Hibernate 的源代码,开发者不仅可以提高自己的技能,还能更好地定制和优化应用程序,解决实际问题。同时,这也有助于跟踪框架的最新发展,以便及时掌握新技术和最佳实践。
《Hibernate的两本英文书籍》可能指的是更深入的原版文档或者专业著作,这些书籍通常会包含最新的技术信息和最佳实践,对于想要深入研究Hibernate或者保持技术更新的开发者来说是不可或缺的资源。可能涵盖的主题包括...
最后,`chapter6`深入研究了Hibernate的缓存机制。Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存)。第一级缓存是默认开启的,每个Session都有一个独立的缓存,可以提高...
总的来说,"hibernate3.2.5.jar"文件是学习和开发使用Hibernate 3.2.5的重要资源,通过深入研究源码和示例程序,开发者可以更好地掌握ORM技术,提高Java应用的数据库处理效率。同时,了解这个版本的特性也能帮助理解...
在深入研究Hibernate源码时,可以关注以下关键点: - **实体管理**:了解实体生命周期(瞬态、持久化、托管和脱管),以及状态转换的过程。 - **HQL和Criteria API**:学习如何构建面向对象的查询,以及它们与原生...
总之,`hibernate-distribution-3.6.2.Final-dist`源码包是学习和研究Hibernate的好资料,通过深入研究源代码,开发者不仅可以掌握ORM的基本原理,还能提升对Java和数据库设计的理解,为开发更高效、更稳定的应用...
这个资源是Hibernate 3.5.6版本的源码,对于理解ORM框架的内部工作原理、学习数据库交互以及深入研究Hibernate的实现机制非常有帮助。 1. **对象关系映射(ORM)**:ORM是Hibernate的核心特性,它允许开发者用Java...
**标题与描述解析** ...通过深入研究hibernate3.jar的源代码,开发者可以更好地了解这些概念如何在实际中实现,以及如何根据自己的需求进行定制和优化。这对于提升Java EE应用的开发效率和质量大有裨益。
通过深入研究这个`hibernate_third`项目,你可以亲身体验到Hibernate在实际开发中的强大功能,同时也能提升你在ORM领域的技能。这个项目提供了丰富的示例,帮助你从实践中掌握各种查询技术,是学习和提升Hibernate...
**标题与描述解析** 标题"传智播客hibernate源码"暗示了这是一个关于Hibernate框架...通过研究这些文件,学习者可以深入了解Hibernate的工作原理,提升数据库操作的技能,并了解如何在实际项目中有效地使用Hibernate。
《Hibernate DOC中文文档》是学习Hibernate框架的重要参考资料,它详细...无论是想要快速入门,还是深入研究,这份文档都是一份不可多得的学习资料。只要你耐心研读,掌握Hibernate并运用到实际项目中将不再是难题。
通过深入研究Hibernate源代码,我们可以更好地掌握Java持久化技术,提高编程效率。 1. Hibernate ORM框架概述:Hibernate是一个强大的ORM框架,它将Java对象与数据库表进行映射,实现了对象的透明持久化。这使得...
深入研究`hibernate-src.zip`中的源码,可以让我们理解Hibernate如何通过反射、代理、动态字节码等技术实现对象的持久化,以及其内部是如何优化SQL语句、处理缓存、管理事务的。这对于提升我们的Java编程技能,尤其...