最近在项目中使用
				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
						提供了那些类和方法来满足开发中查询条件的创建和组装,其结构层次如何。这样使用起来便可得心应手。