Criteria和DetachedCriteria是hibernate的两个查询方法(方便查询条件的组装)。
hibernate设计了CriteriaSpecification作为Criteria的父接口,提供Criteria和DetachedCriteria。
Criteria和DetachedCriteria主要区别是创建形式不同:
1.Criteria是在线的,是由Hibernate Session进行创建;
2.DetachedCriteria是离线的,创建无需session,而是由DetachedCriteria提供了2个静态方法
forClass(Class)或者forEntityName(Name)进行DetachedCriteria实例的创建。
Spring框架提供了getHibernateTemplate().findByCriteria(detachedCriteria)方法可以根据DetachedCriteria来
返回查询结果。
Criteria和DetachedCriteria均可使用Criteria和Projection设置查询条件。
可以设置FetchMode(联合查询抓取的模式),设置排序方式。
对于Criteria还可以设置FlushModel(冲刷Session的方式)和LockMode(数据库锁模式)。
Criterion是Criteria的查询条件。
Criteria提供了add(Criterion criterion)方法来添加查询条件。
Criterion接口主要实现:Example、Junction和SimpleExpression。
Junction的实际使用是它的两个子类conjunction和disjunction,分别使用AND和OR操作符进行联结查询条件集合。
Criterion的实例可以通过Restrictions工具类来创建,Restrictions提供了大量的静态方法,如eq(=)、ge(>=)、
between等方法来创建Criterion查询条件(SimpleException实例)。Restrictions还提供了方法来创建conjunction和
disjunction实例,通过往该实例的add(Criteria)方法来增加查询条件形成一个查询条件集合。
Example本身提供了一个静态方法create(Object entity),即根据一个对象(实际使用中一般是映射到数据库的对象)
来创建。
过滤条件:
Example exampleUser=Example.create(u).ignoreCase().enableLike(MatchMode.ANYWHERE);
//忽略大小写;对于String类型的属性,无论值在哪里都匹配。相当于%value%
Project主要是让Criteria能够进行报表查询,并实现分组。Project主要有SimpleProjection、ProjectionList和Property
三个实现。其中SimpleProject和ProjectionList的实例化是由内建的Projections来完成,如提供avg、count、max、
min、sum可以对某个字段进行统计查询。
Property是对某个字段进行查询条件的设置,如,通过Property.forName("color").in(new String[]{"black","red","write"});创建
一个Project实例。通过criteria的add(Project)方法加入到查询条件中去。
使用criteria进行查询,hibernate提供了那些类和方法来满足开发中查询条件的创建和组装。
1. 创建一个Criteria 实例
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. 限制结果集内容
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。
org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.between("weight", minWeight, maxWeight) )
.list();
约束可以按逻辑分组。
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )