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