最近在项目中使用 Spring 和 Hibernate 进行开发有感于 Criteria 比较好用在查询方法设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装所以现在对 Hibernate 的 Criteria 深入研究一下《 Hibernate Reference 》及网上其它一些资料对 Criteria 已经做了很多介绍本文主要是从 Criteria 的结构入手来进行分析
如图 Hibernate 设计了 CriteriaSpecification 作为 Criteria 的顶级接口其下面提供了 Criteria 和 DetachedCriteria
Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样 Criteria 是在线的所以它是由 Hibernate Session 进行创建的而 DetachedCriteria 是离线的创建时无需 Session DetachedCriteria 提供了 个静态方法 forClass(Class) 或 forEntityName(Name) 进行 DetachedCriteria 实例的创建 Spring 的框架提供了
getHibernateTemplate()findByCriteria(detachedCriteria) 方法可以很方便地根据
DetachedCriteria 来返回查询结果
如图 Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件可以设置 FetchMode( 联合查询抓取的模式 ) 设置排序方式对于 Criteria 还可以设置 FlushModel (沖刷 Session 的方式)和 LockMode (数据库锁模式)
下面就对 Criterion 和 Projection 进行详细说明
图
Criterion 是 Criteria 的查询条件
Criteria 提供了 add(Criterion criterion) 方法来添加查询条件图 是 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 =Examplecreate(u)
ignoreCase() // 忽略大小写
enableLike(MatchModeANYWHERE);
// 对 String 类型的属性无论在那里值在那里都匹配相当于 %value%
图
Project 主要是让 Criteria 能够进行报表查询并可以实现分组 Project 主要有 SimpleProjection ProjectionList 和 Property 三个实现其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 Projections 来完成如提供的 avg count max min sum 可以让开发者很容易对某个字段进行统计查询
Property 是对某个字段进行查询条件的设置如通过
PorpertyforName(color)in(new String[]{blackredwrite}); 则可以创建一个 Project 实例通过 criteria 的 add(Project) 方法加入到查询条件中去
图
使用 Criteria 进行查询主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装其结构层次如何这样使用起来便可得心应手