`
zgdkik
  • 浏览: 6001 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Criteria的特点

 
阅读更多

在查询方法设计上可以灵活的根据Criteria的特点来方便地进行查询条件的组装.
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(Criterion 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% 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)方法加入到查询条件中去.使用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%"))
.add(Restrictions.or(Restrictions.eq("age",new Integer(0)),Restrictions.isNull("age")))
.list();

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();

Hibernate提供了相当多的内置criterion类型(Restrictions子类),但是尤其有用的是可以允许你直接使用SQL.

List cats = sess.createCriteria(Cat.class)
.add(Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list();

{alias}占位符应当被替换为被查询实体的列别名.
Property实例是获得一个条件的另外一种途径.你可以通过调用Property.forName()创建一个Property.

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();

3.结果集排序
你可以使用org.hibernate.criterion.Order来为查询结果排序.
List cats = sess.createCriteria(Cat.class)
.add(Restrictions.like("name","F%")
.addOrder(Order.asc("name"))
.addOrder(Order.desc("age"))
.setMaxResults(50)
.list();

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();

4.关联
你可以使用createCriteria()非常容易的在互相关联的实体间建立约束.
List cats = sess.createCriteria(Cat.class)
.add(Restrictions.like("name","F%")
.createCriteria("kittens")
.add(Restrictions.like("name","F%")
.list();

注意第二个createCriteria()返回一个新的Criteria实例,该实例引用kittens集合中的元素.接下来,替换形态在某些情况下也是很有用的.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens","kt")
.createAlias("mate","mt")
.add(Restrictions.eqProperty("kt.name","mt.name"))
.list();

(createAlias()并不创建一个新的Criteria实例)Cat实例所保存的之前两次查询所返回的kittens集合是没有被条件预过滤的.
如果你希望只获得符合条件的kittens,你必须使用returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens","kt")
.add(Restrictions.eq("name","F%"))
.returnMaps()
.list();

Iterator iter = cats.iterator();
while(iter.hasNext()) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}

5.动态关联抓取
你可以使用setFetchMode()在运行时定义动态关联抓取的语义.
List cats = sess.createCriteria(Cat.class)
.add(Restrictions.like("name","Fritz%"))
.setFetchMode("mate",FetchMode.EAGER)
.setFetchMode("kittens",FetchMode.EAGER)
.list();
这个查询可以通过外连接抓取mate和kittens.

6.查询示例
org.hibernate.criterion.Example类允许你通过一个给定实例构建一个条件查询.
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add(Example.create(cat))
.list();
版本属性、标识符和关联被忽略.默认情况下值为null的属性将被排除.可以自行调整Example使之更实用.

Example example = Example.create(cat)
.excludeZeroes() //exclude zero valued properties
.excludeProperty("color") //exclude the property named "color"
.ignoreCase() //perform case insensitive string comparisons
.enableLike(); //use like for string comparisons
List results = session.createCriteria(Cat.class)
.add(example)
.list();

甚至可以使用examples在关联对象上放置条件.
List results = session.createCriteria(Cat.class)
.add(Example.create(cat))
.createCriteria("mate")
.add(Example.create(cat.getMate()))
.list();

7.投影(Projections)、聚合(aggregation)和分组(grouping)
org.hibernate.criterion.Projections是Projection的实例工厂.我们通过调用setProjection()应用投影到一个查询.

List results = session.createCriteria(Cat.class)
.setProjection(Projections.rowCount())
.add(Restrictions.eq("color",Color.BLACK))
.list();

List results = session.createCriteria(Cat.class)
.setProjection(Projections.projectionList()
.add(Projections.rowCount())
.add(Projections.avg("weight"))
.add(Projections.max("weight"))
.add(Projections.groupProperty("color"))
)
.list();

在一个条件查询中没有必要显式的使用"group by".某些投影类型就是被定义为分组投影,他们也出现在SQL的group by子句中.
可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用.下面是两种不同的实现方式:

List results = session.createCriteria(Cat.class)
.setProjection(Projections.alias(Projections.groupProperty("color"),"colr"))
.addOrder(Order.asc("colr"))
.list();

List results = session.createCriteria(Cat.class)
.setProjection(Projections.groupProperty("color").as("colr"))
.addOrder(Order.asc("colr"))
.list();

alias()和as()方法简便的将一个投影实例包装到另外一个别名的Projection实例中.简而言之,当你添加一个投影到一个投影列表中时你可以为它指定一个别名:

List results = session.createCriteria(Cat.class)
.setProjection(Projections.projectionList()
.add(Projections.rowCount(),"catCountByColor")
.add(Projections.avg("weight"),"avgWeight")
.add(Projections.max("weight"),"maxWeight")
.add(Projections.groupProperty("color"),"color")
)
.addOrder(Order.desc("catCountByColor"))
.addOrder(Order.desc("avgWeight"))
.list();

List results = session.createCriteria(Domestic.class,"cat")
.createAlias("kittens","kit")
.setProjection(Projections.projectionList()
.add(Projections.property("cat.name"),"catName")
.add(Projections.property("kit.name"),"kitName")
)
.addOrder(Order.asc("catName"))
.addOrder(Order.asc("kitName"))
.list();

也可以使用Property.forName()来表示投影:

List results = session.createCriteria(Cat.class)
.setProjection(Property.forName("name"))
.add(Property.forName("color").eq(Color.BLACK))
.list();

List results = session.createCriteria(Cat.class)
.setProjection(Projections.projectionList()
.add(Projections.rowCount().as("catCountByColor"))
.add(Property.forName("weight").avg().as("avgWeight"))
.add(Property.forName("weight").max().as("maxWeight"))
.add(Property.forName("color").group().as("color")
)
.addOrder(Order.desc("catCountByColor"))
.addOrder(Order.desc("avgWeight"))
.list();

8.离线(detached)查询和子查询
DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的session来执行它.

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
.add(Property.forName("sex").eq('F'));
//创建一个Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();

DetachedCriteria也可以用以表示子查询.条件实例包含子查询可以通过Subqueries或者Property获得.

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
.setProjection(Property.forName("weight").avg());
session.createCriteria(Cat.class)
.add(Property.forName("weight).gt(avgWeight))
.list();
DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
.setProjection(Property.forName("weight"));
session.createCriteria(Cat.class)
.add(Subqueries.geAll("weight",weights))
.list();

相互关联的子查询也是有可能的:
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class,"cat2")
.setProjection(Property.forName("weight").avg())
.add(Property.forName("cat2.sex").eqProperty("cat.sex"));
session.createCriteria(Cat.class,"cat")
.add(Property.forName("weight).gt(avgWeightForSex))
.list();

补充:
criteria.add(Expression.eq("status",new Integer(status)));
criteria.add(Expression.in("status", optParm.getQueryStatus()));

 

http://javacrazyer.iteye.com/blog/714224

  • 000.rar (510.6 KB)
  • 下载次数: 0
分享到:
评论

相关推荐

    Hibernate中Criteria的使用

    在查询方法设计上可以灵活地根据 Criteria 的特点来方便地进行查询条件的组装。 Criteria 是 Hibernate 中的一种查询机制,它提供了灵活的查询条件组装方式。Criteria 是在线的,所以它是由 Hibernate Session 进行...

    Criteria使用方法

    ### Criteria使用方法详解 #### 一、概述 在软件开发过程中,尤其是涉及到数据库操作的应用程序中,查询语言的灵活性和效率对于项目的成功至关重要。Hibernate作为Java领域中最流行的ORM(Object Relational ...

    Hibernate的HQL与Criteria资料

    它的主要特点包括: 1. **面向对象**:HQL基于类和对象进行查询,而不是数据库表和列。 2. **类型安全**:由于在编译时就能确定对象类型,因此可以避免SQL注入等安全问题。 3. **支持聚合函数**:如SUM、AVG、MAX、...

    JPA 动态查询 Criteria JPQL 语法详解

    Criteria API 的主要特点是提供了一个能够在运行时动态地构建查询的机制。 JPQL 的缺陷 JPQL(Java Persistence Query Language)是一种强大的查询语言,它在 JPA 1.0 中被引入。但是,基于字符串并使用有限语法的...

    common criteria认证第一部分

    #### 三、CC 3.1版本特点 - **消除冗余评估活动**:通过精简评估流程,避免重复工作,提高评估效率。 - **减少不必要的活动**:识别出对最终产品安全性贡献较小的活动,并将其减少或完全剔除。 - **澄清术语**:...

    Hibernate Criteria 完全使用

    Criteria 在查询方法设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。

    自定义查询框架Criteria

    我尝试着模仿hibernate的criteria构建这么一个轻量级查询框架,提供一下特点: 1 可以根据前台传过来的查询数据自动构建查询条件 2 可以生成纯SQl 3 也可以直接使用preparestatement进行查询,返回我们想要的数据。 ...

    条件类Criteria的用法.docx

    Criteria API的另一个特点是Query By Criteria(QBC)。QBC查询允许开发者更直观地以面向对象的方式构建查询。以下是一个简单的例子,查询名字为"zx"且年龄为27的User对象: ```java Criteria criteria = session....

    持续性:面向JPA提供者的Rich Criteria API

    炽烈持久Blaze-Persistence是面向JPA提供程序的丰富的...产品特点Blaze-Persistence不仅是一个Criteria API,它使构建查询变得更加容易,而且还具有许多JPA提供程序通常不支持的功能。 这是Blaze-Persistence在JPA模

    SpringRestBugtracker:使用Spring,Hibernate,Criteria,Oracle base的Rest服务

    在项目中,Hibernate的Criteria API用于构建动态查询,它可以灵活地根据条件构造SQL语句,避免了硬编码SQL的风险。同时,Hibernate的Session和Transaction管理确保了数据的一致性和完整性。 再者,Oracle数据库是...

    hibernate里面的 两种查询

    这两种查询方法各有特点,适用于不同的场景,使得开发者可以根据实际需求灵活选择。 1. Hibernate Criteria API: Criteria API 是Hibernate提供的一种面向对象的查询方式,它允许开发者通过构建对象来表示查询条件...

    Hibernate 查询经典练习题

    我们将通过两个经典的练习题来深入理解这两个查询方式,并讨论它们在处理不同查询需求时的特点。 ### 练习题一:查询所有部门及其所在地 #### SQL查询 ```sql SELECT loc FROM dept; ``` 这个简单的SQL语句用于...

    Hibernate 分页查询效果

    这两种方式都能有效地完成任务,但各有特点。Criteria API更具有面向对象的特性,而HQL则接近于SQL,对于熟悉SQL的开发者更为友好。 1. Criteria API分页: 使用Criteria API进行分页,我们需要创建Criteria对象,...

    恒流LED驱动模块手册

    本手册介绍了KC24H系列恒流LED驱动模块,具有高效率、宽输入电压范围、恒流模式、大功率输出、模拟调光+PWM调光、开/关控制功能、可持续短路保护等特点。该模块适用于景观照明、特控照明、背光源、商务照明、路灯...

    Python-multicriteriacws简单有效的多标准中文分词

    本文将详细介绍这个库的特点、原理以及如何在实际应用中使用它。 ### 1. 中文分词的重要性 中文分词是将连续的汉字序列切分成具有语义的词汇单位的过程,它是各种中文文本处理任务(如情感分析、机器翻译、问答...

    简单介绍如何使用Spring Boot使用JdbcTemplate与MySQL进行数据库操作

    Spring Boot以其简化配置和快速启动的特点,已经成为Java开发者的首选框架。而JdbcTemplate是Spring框架的一部分,它提供了一种简单且安全的方式来操作数据库,避免了直接编写SQL导致的潜在错误。 首先,确保你的...

    Hibernate QBC高级查询.rar

    相比HQL,Criteria API更具有面向对象的特点,可以动态地构建查询条件,适应复杂的需求。 2. **DetachedCriteria**:这是一个离线查询对象,可以在不与Session交互的情况下构建查询条件,然后在需要的时候再与...

Global site tag (gtag.js) - Google Analytics