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

Hibernate Criteria Queries

阅读更多
条件查询(Criteria Queries)
具有一个直观的、可扩展的条件查询API是Hibernate的特色。
 
1. 创建一个Criteria 实例
org.hibernate.Criteria接口表示特定持久类的一个查询。SessionCriteria实例的工厂。
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();
 
这个查询可以通过外连接抓取matekittens
 
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.ProjectionsProjection 的实例工厂。我们通过调用 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&
分享到:
评论
1 楼 fendou311 2012-12-05  

相关推荐

    hibernate-sample:示例 Hibernate 项目以显示 Exists 子句的用法

    使用 Hibernate Criteria && DetachedCriteria Queries演示Exists Clause非常简单的项目 安装 git clone https://github.com/RameshRM/hibernate-sample.git 跑步 mvn install 这是一个maven项目,依赖项是 ...

    Hibernate Recipes A Problem-Solution Approach

    How to perform batch processing and use native SQL, criteria queries, caching objects, and more How to enable Hibernate in web applications with e-commerce How to use Hibernate for heavy-duty ...

    Hibernate框架参考文档

    15. 条件查询(Criteria Queries); 16. Native SQL查询; 17. 过滤数据; 18. XML映射; 19. 提升性能; 20. 工具箱指南; 21. 示例:父子关系(Parent Child Relationships); 22. 示例:Weblog 应用程序; 23. 示例:复杂...

    Hibernate+中文文档

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. ...

    Beginning.Hibernate.For.Hibernate.5.4th.Edition

    Get started with the ...Chapter 10: Advanced Queries Using Criteria Chapter 11: Filtering the Results of Searches Chapter 12: Leaving the Relational Database Behind: NoSQL Chapter 13: Hibernate Envers

    hibernate3.2中文文档(chm格式)

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. ...

    HibernateAPI中文版.chm

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. ...

    Hibernate 3.6.0.Final Reference PDF 手册

    第 17 章 条件查询(Criteria Queries) 第 18 章 Native SQL 查询 第 19 章 过滤数据 第 20 章 XML 映射 第 21 章 提升性能 第 22 章 工具箱指南 第 23 章 Additional modules 第 24 章 ...

    Hibernate中文详细学习文档

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. ...

    Hibernate 中文 html 帮助文档

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出...

    最全Hibernate 参考文档

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出...

    Hibernate Reference Documentation3.1

    10.4.3. Criteria queries 10.4.4. Queries in native SQL 10.5. Modifying persistent objects 10.6. Modifying detached objects 10.7. Automatic state detection 10.8. Deleting persistent objects 10.9. ...

    hibernate 教程

    根据示例查询(Example queries) 13. 原生SQL查询 13.1. 创建一个基于SQL的Query 13.2. 别名和属性引用 13.3. 为SQL查询命名 14. 性能提升(Improving performance) 14.1. 理解集合的性能 ...

    hibernate 体系结构与配置 参考文档(html)

    15. 条件查询(Criteria Queries) 15.1. 创建一个Criteria 实例 15.2. 限制结果集内容 15.3. 结果集排序 15.4. 关联 15.5. 动态关联抓取 15.6. 查询示例 15.7. 投影(Projections)、聚合(aggregation)和分组...

    Hibernate教程

    11.4.3. 条件查询(Criteria queries) 11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. ...

    Hibernate3+中文参考文档

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出...

    hibernate3.04中文文档.chm

    11.4.3. 条件查询(Criteria queries) 11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. ...

    Hibernate3的帮助文档

    11.4.3. 条件查询(Criteria queries) 11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象

    Hibernate参考文档

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出...

Global site tag (gtag.js) - Google Analytics