Criteria 和 DetachedCriteria 的区别和应用.docx
《Criteria 和 DetachedCriteria 的区别和应用.docx》由会员分享,可在线阅读,更多相关《Criteria 和 DetachedCriteria 的区别和应用.docx(24页珍藏版)》请在冰豆网上搜索。
Criteria和DetachedCriteria的区别和应用
Hibernate设计了CriteriaSpecification作为Criteria的父接口,下面提供了Criteria和DetachedCriteria。
Criteria和DetachedCriteria的主要区别在于创建的形式不一样,Criteria是在线的,所以它是由HibernateSession进行创建的;而DetachedCriteria是离线的,创建时无需Session,DetachedCriteria提供了2个静态方法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(Criterioncriterion)方法来添加查询条件。
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(Objectentity),即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。
然后可以设置一些过滤条件:
ExampleexampleUser=Example.create(u).ignoreCase()//忽略大小写.enableLike(MatchMode.ANYWHERE);//对String类型的属性,无论在那里值在那里都匹配。
相当于%value% Project主要是让Criteria能够进行报表查询,并可以实现分组。
Project主要有SimpleProjection、ProjectionList和Property三个实现。
其中SimpleProjection和ProjectionList的实例化是由内建的Projections来完成,如提供的avg、count、max、min、sum可以让开发者很容易对某个字段进行统计查询。
Property是对某个字段进行查询条件的设置,如通过Porperty.forName(“color”).in(newString[]{“black”,”red”,”write”});则可以创建一个Project实例。
通过criteria的add(Project)方法加入到查询条件中去。
使用Criteria进行查询,主要要清晰的是Hibernate提供了那些类和方法来满足开发中查询条件的创建和组装,下面介绍几种用法:
创建一个Criteria实例
org.hibernate.Criteria接口表示特定持久类的一个查询。
Session是Criteria实例的工厂。
Criteriacrit=sess.createCriteria(Cat.class);
crit.setMaxResults(50);
Listcats=crit.list();
Criteriacrit=sess.createCriteria(Cat.class);
crit.setMaxResults(50);
Listcats=crit.list();
Java代码
Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list();
Criteriacrit=sess.createCriteria(Cat.class);crit.setMaxResults(50);Listcats=crit.list();
限制结果集内容
一个单独的查询条件是org.hibernate.criterion.Criterion接口的一个实例。
org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型的工厂方法。
Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.like("name","Fritz%"))
.add(Restrictions.between("weight",minWeight,maxWeight))
.list();
Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.like("name","Fritz%"))
.add(Restrictions.between("weight",minWeight,maxWeight))
.list();
Java代码
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();
Listcats=sess.createCriteria(Cat.class).add(Restrictions.like("name","Fritz%")).add(Restrictions.between("weight",minWeight,maxWeight)).list();
约束可以按逻辑分组。
Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.like("name","Fritz%"))
.add(Restrictions.or(
Restrictions.eq("age",newInteger(0)),
Restrictions.isNull("age")
))
.list();
Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.like("name","Fritz%"))
.add(Restrictions.or(
Restrictions.eq("age",newInteger(0)),
Restrictions.isNull("age")
1. ))
2. .list();
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Restrictions.in("name",newString[]{"Fritz","Izi","Pk"}))
3. .add(Restrictions.disjunction()
4. .add(Restrictions.isNull("age"))
5. .add(Restrictions.eq("age",newInteger(0)))
6. .add(Restrictions.eq("age",newInteger
(1)))
7. .add(Restrictions.eq("age",newInteger
(2)))
8. ))
9. .list();
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Restrictions.in("name",newString[]{"Fritz","Izi","Pk"}))
3. .add(Restrictions.disjunction()
4. .add(Restrictions.isNull("age"))
5. .add(Restrictions.eq("age",newInteger(0)))
6. .add(Restrictions.eq("age",newInteger
(1)))
7. .add(Restrictions.eq("age",newInteger
(2)))
8. ))
9. .list();
Java代码
1.List cats = sess.createCriteria(Cat.class) .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) .add( Restrictions.disjunction() .add( Restrictions.isNull("age") ) .add( Restrictions.eq("age", new Integer(0) ) ) .add( Restrictions.eq("age", new Integer
(1) ) ) .add( Restrictions.eq("age", new Integer
(2) ) ) ) ) .list();
Listcats=sess.createCriteria(Cat.class).add(Restrictions.in("name",newString[]{"Fritz","Izi","Pk"})).add(Restrictions.disjunction().add(Restrictions.isNull("age")).add(Restrictions.eq("age",newInteger(0))).add(Restrictions.eq("age",newInteger
(1))).add(Restrictions.eq("age",newInteger
(2))))).list();
Hibernate提供了相当多的内置criterion类型(Restrictions子类),但是尤其有用的是可以允许你直接使用SQL。
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Restrictions.sql("lower({alias}.name)likelower(?
)","Fritz%",
3.Hibernate.STRING))
4. .list();
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Restrictions.sql("lower({alias}.name)likelower(?
)","Fritz%",
3.Hibernate.STRING))
4. .list();
Java代码
1.List cats = sess.createCriteria(Cat.class) .add( Restrictions.sql("lower({alias}.name) like lower(?
)", "Fritz%", Hibernate.STRING) ) .list();
Listcats=sess.createCriteria(Cat.class).add(Restrictions.sql("lower({alias}.name)likelower(?
)","Fritz%",Hibernate.STRING)).list();
{alias}占位符应当被替换为被查询实体的列别名。
Property实例是获得一个条件的另外一种途径。
你可以通过调用Property.forName()创建一个Property。
1.Propertyage=Property.forName("age");
2.stcats=sess.createCriteria(Cat.class)
3. .add(Restrictions.disjunction()
4. .add(age.isNull())
5. .add(age.eq(newInteger(0)))
6. .add(age.eq(newInteger
(1)))
7. .add(age.eq(newInteger
(2)))
8. ))
9. .add(Property.forName("name").in(newString[]{"Fritz","Izi","Pk"}))
10. .list();
1.Propertyage=Property.forName("age");
2.stcats=sess.createCriteria(Cat.class)
3. .add(Restrictions.disjunction()
4. .add(age.isNull())
5. .add(age.eq(newInteger(0)))
6. .add(age.eq(newInteger
(1)))
7. .add(age.eq(newInteger
(2)))
8. ))
9. .add(Property.forName("name").in(newString[]{"Fritz","Izi","Pk"}))
10. .list();
Java代码
1.Property age = Property.forName("age"); List cats = sess.createCriteria(Cat.class) .add( Restrictions.disjunction() .add( age.isNull() ) .add( age.eq( new Integer(0) ) ) .add( age.eq( new Integer
(1) ) ) .add( age.eq( new Integer
(2) ) ) ) ) .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) ) .list();
Propertyage=Property.forName("age");Listcats=sess.createCriteria(Cat.class).add(Restrictions.disjunction().add(age.isNull()).add(age.eq(newInteger(0))).add(age.eq(newInteger
(1))).add(age.eq(newInteger
(2))))).add(Property.forName("name").in(newString[]{"Fritz","Izi","Pk"})).list();
3.结果集排序
你可以使用org.hibernate.criterion.Order来为查询结果排序。
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Restrictions.like("name","F%")
3. .addOrder(Order.asc("name"))
4. .addOrder(Order.desc("age"))
5. .setMaxResults(50)
6. .list();
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Restrictions.like("name","F%")
3. .addOrder(Order.asc("name"))
4. .addOrder(Order.desc("age"))
5. .setMaxResults(50)
6. .list();
Java代码
1.List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list();
Listcats=sess.createCriteria(Cat.class).add(Restrictions.like("name","F%").addOrder(Order.asc("name")).addOrder(Order.desc("age")).setMaxResults(50).list();
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Property.forName("name").like("F%"))
3. .addOrder(Property.forName("name").asc())
4. .addOrder(Property.forName("age").desc())
5. .setMaxResults(50)
6. .list();
1.Listcats=sess.createCriteria(Cat.class)
2. .add(Property.forName("name").like("F%"))
3. .addOrder(Property.forName("name").asc())
4. .addOrder(Property.forName("age").desc())
5. .setMaxResults(50)
6. .list();
Java代码
1.List cats = sess.createCriteria(Cat.class) .add( Property.forName("name").like("F%") ) .addOrder( Property.forName("name").asc() ) .addOrder( Property.forName("age").desc() ) .setMaxResults(50) .list();
Listcats=sess.createCriteria(Cat.class).add(Property.forName("name").like("F%")).addOrder(Property.forName("name").asc()).addOrder(Property.forName("age").desc()).setMaxResults(50).list();
4.关联
你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。
1.Listcats=sess.createCriteria(Cat.class)
2. .add(