Criteria 和 DetachedCriteria 的区别和应用.docx

上传人:b****2 文档编号:2466282 上传时间:2023-05-03 格式:DOCX 页数:24 大小:24.30KB
下载 相关 举报
Criteria 和 DetachedCriteria 的区别和应用.docx_第1页
第1页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第2页
第2页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第3页
第3页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第4页
第4页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第5页
第5页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第6页
第6页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第7页
第7页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第8页
第8页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第9页
第9页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第10页
第10页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第11页
第11页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第12页
第12页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第13页
第13页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第14页
第14页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第15页
第15页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第16页
第16页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第17页
第17页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第18页
第18页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第19页
第19页 / 共24页
Criteria 和 DetachedCriteria 的区别和应用.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Criteria 和 DetachedCriteria 的区别和应用.docx

《Criteria 和 DetachedCriteria 的区别和应用.docx》由会员分享,可在线阅读,更多相关《Criteria 和 DetachedCriteria 的区别和应用.docx(24页珍藏版)》请在冰点文库上搜索。

Criteria 和 DetachedCriteria 的区别和应用.docx

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(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2