最近在项目中使用
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
进行详细说明。
图
1
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
提供了那些类和方法来满足开发中查询条件的创建和组装,其结构层次如何。这样使用起来便可得心应手。
posted on 2007-02-02 19:53
☜♥☞MengChuChen 阅读(173)
评论(0) 编辑 收藏