`
demojava
  • 浏览: 549077 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate学习笔记--Criteria Query

    博客分类:
  • JAVA
阅读更多

Criteria Query通过面向对象的设计,将数据查询条件封装为一个对象。简单来说,Criteria Query可以看作是传统SQL的对象化表示,如:

Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq(
"name","Erica"));
criteria.add(Expression.eq(
"sex",new Integer(1));

这里的criteria实例本质上是对SQL“select * from t_user where name='Erica' and sex=1”的封装。
Hibernate在运行期会根据Criteria中指定的查询条件生成相应的SQL语句。

Criteria查询表达式
    Criteria本身只是一个容器,具体的查询条件要通过Criteria.add方法添加到Criteria实例中。

方法 描述
Expression.eq

对应SQL “field=value”表达式

如:Expression.eq("name","Erica")

Expression.allEq 参数为一个Map对象,其中包含了多个属性-值对应关系。相当于多个Expression.eq关系的叠加
Expression.gt 对应SQL“field>value”表达式
Expression.ge 对应SQL“field>=value”表达式
Expression.lt 对应SQL“field<value”表达式
Expression.le 对应SQL“field<=value”表达式
Expression.between

对应SQL“between”表达式

如:Expression.between("age",new Integer(13),new Integer(50));

Expression.like 对应SQL"field like valule"表达式
Expression.in 对应SQL“field in...”表达式
Expression.eqproperty 用于比较两个属性之间的值,对应SQL“field>field”
Expression.gtProperty 用于比较两个属性之间的值,对应SQL“field>=field”
Expression.ltProperty 用于比较两个属性之间的值,对应SQL"field<field"
Expression.leProperty 用于比较两个属性之间的值,对应SQL"field<=field"
Expression.and

and关系组合,如:

Expression.add(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1)))

Expression.or

or关系组合,如:

Expression.or(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1)))

Expression.sql

作为补充,本方法提供了原生SQL语法的支持,我们可以通过这个方法直接通过SQL语句限定查询条件

下面的代码返回所有名称以"Erica"其实的记录:
Expression.sql("lower({alias}.name) like lower(?)","Erica%",Hibernate.STRING);
其中的"{alias}"将Hibernate在运行期使用当前关联的POJO别名替换


在Hibernate3中,引入了Restrictions类作为Expression的替代。

示例查询
    Example类实现了Criteria接口,同样,它也可以用作Criteria的查询条件。Example的作用是:根据已有对象,查找属性与之相符的其他对象。

Criteria criteria=session.CreateCriteria(TUser.class);
TUser exampleUser
=new TUser();
exapleUser.getName(
"Erica");
criteria.add(Example.create(exampleUser));

List
<TUser> list=criteria.list();

for(TUser user:list){
System.out.println(user.getName());
}

新建一个TUser对象exampleUser,并作为范本,查询所有name属性与之相同的记录。

复合查询

Criteria criteria=session.createCriteria(TUser.class);
Criteria addrCriteria=criteria.createCriteria("addresses");
addrCriteria.add(Expression.like("addresses","%shanghai%"));


List
<TUser> list = criteria.list();
for(TUser user:list){
    System.out.println(user.getName());
    Set
<TAddress> addrSet=user.getAddresses();
    
for(TAddress addr:addrSet){
        System.out.println(addr.getAddress());
    }

}

红色部分就是我们新增的复合查询条件,可以看到,我们可以通过Criteria.createCriteria方法在原有Criteria对象的基础上构建复合查询。

DetachedCriteria
   Hibernate2中,Criteria生命周期位于其宿主Session生命周期中,也就是说,由某个session创建的Criteria实例,一旦session销毁,那么此Criteria实例也随之失效。
    Hibernate3中引入了DetachedCriteria,DetachedCriteria可以脱离session实例独立存在,这样,我们就可以将某些通用的Criteria查询条件进行抽离,每次使用时再与当前session实例绑定以获得更好的代码重用效果。

DetachedCriteria deCriteria=DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq(
"name","Erica"));
deCriteria.add(Expression.eq(
"sex",new Integer(1)));

Criteria criteria=deCriteria.getExecutableCriteria(session);
List<TUser> list=criteria.list();
for(TUser user:list){
    System.out.println(user.getName());
}

DetachedCriteria的生存周期与session实例无关,我们可以独立创建DetachedCriteria实例,并在需要使用时与session相绑定,从而获得运行期Criteria实例。这样,我们就可以将查询逻辑和Criteria实例分离,以获得最大化代码的重用效果。
    DetachedCriteria也可以用于子查询表达:

DetachedCriteria aveAge=DetachedCriteria.forClass(TUser.class);
avgAge.setProjection(Projections.avg(
"age"));

Criteria criteria
=session.createCriteria(TUser.class);
criteria.add(Subqueries.propertyGT("age",avgAge));

 

通过Subqueries我们可以将DetachedCriteria纳入查询表达式,反映在SQL上则是一个典型的子查询语句。上例生成的SQL语句大致如:select ... from T_User where age > (select avg(age) from T_User)

Criteria高级特性
    限定返回的记录范围
        通过criteria.setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围:

Criteria criteria=session.createCriteria(TUser.class);
//限定查询返回检索结果中,从100条结果开始的20条记录
criteria.setFirstResult(100);
criteria.setMaxResults(
20);

        记录排序:

//
//
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq(
"groupId",new Integer(2)));

criteria.addOrder(Order.asc(
"name"));
criteria.addOrder(Order.desc(
"groupId"));


    分组与统计
        在Hibernate3中,我们还可以通过Criteria完成分组和统计。分组、统计表达式由Hibernate3新引入的Projections Class进行封装。

Criteria criteria=session.createCriteria(TUser.class);
criteria.setProjection(Projections.groupProperty("age"));


List
<TUser> list=criteria.list();
for(TUser user:list){
    System.out.println(user);
}

上例对当前的TUser记录按照年龄进行分组。通过Projections.groupProperty方法,我们指定了用于分组的目标属性“age”。生成的SQL语句:select this.age as y0_ from T_User this_group by this_.age。
    另外,对于多条件组合的统计、分组功能,我们可以借助ProjectionList完成,下面的例子中,我们统计了各个年龄层次中的用户数量:

ProjectionList projectionlist=Projections.ProjectionList();
projectionList.add(Projections.groupProperty(
"age"));
projectionList.add9Projections.rowCount());

Criteria criteria
=session.createCriteria(TUser.class);
criteria.setProjection(projectionList);

本文转载:http://www.cnblogs.com/MeChecksV/

分享到:
评论

相关推荐

    hibernate学习笔记-01helloword

    【标题】"hibernate学习笔记-01helloworld"主要涵盖了Hibernate框架的基础入门知识,是初学者了解和掌握Hibernate的重要起点。Hibernate是一款强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者...

    Hibernate---我的Hibernate学习笔记.doc

    ### Hibernate—我的Hibernate学习笔记 #### 一、对象持久化的理论与实践 ##### 对象持久化概念 对象持久化指的是将内存中的对象状态保存至外部持久性存储设备(如硬盘),以便于日后需要时能够恢复其状态。这一...

    Java相关课程系列笔记之十四Hibernate学习笔记

    【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...

    Hibernate学习笔记与总结

    **Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...

    hibernate学习笔记,学习大纲【吐血推荐】

    **Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...

    hibernate学习笔记文档

    ### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...

    hibernate API帮助文档 及hibernate学习笔记

    Hibernate是一款强大的Java持久...通过阅读这份“Hibernate API帮助文档”和“Hibernate学习笔记”,你将能够深入理解Hibernate的工作原理,掌握其API的使用,并能在实际项目中有效地利用Hibernate进行数据持久化操作。

    Hibernate学习笔记(1-13)

    【Hibernate学习笔记(1-13)】是传智播客李勇的教程,涵盖了Hibernate框架的基础到进阶内容。Hibernate是一个流行的ORM(对象关系映射)框架,它旨在解决Java面向对象编程与关系型数据库之间的模型不匹配问题,即...

    马士兵hibernate学习笔记

    ### 马士兵 Hibernate 学习笔记概览 #### 一、Hello World 示例 - **简介**:通过简单的示例程序来快速入门 Hibernate 框架。 - **步骤**: 1. 创建 Java 项目 `hibernate_0100_HelloWorld`。 2. 构建 User-...

    hibernate学习笔记mashibing

    《Hibernate学习笔记——马士兵教程解析》 在Java开发领域,ORM(Object-Relational Mapping)框架的使用已经非常普遍,其中Hibernate作为一款优秀的ORM框架,因其强大的功能和易用性深受开发者喜爱。本文将根据马...

    hibernate学习笔记第四天的源码

    **hibernate学习笔记第四天源码解析** 在hibernate学习的过程中,第四天通常会深入探讨实体类、映射文件、配置文件以及查询语言等方面的内容。这些是hibernate框架的基础,也是开发者掌握持久化操作的关键。让我们...

    hibernate-学习笔记

    【hibernate-学习笔记】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中管理关系数据库数据的便捷方式。本学习笔记将深入探讨Hibernate的核心概念、配置、实体映射、查询...

    hibernate学习笔记第二天的源码

    在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...

    hibernate总结--云图智联

    例如,通过HQL(Hibernate Query Language)可以实现复杂的查询;利用注解(Annotations)和Criteria查询可以进行更加面向对象的数据库操作;在MyBatis入门章节中,则介绍了如何使用MyBatis框架替代JDBC,尽管...

    马士兵hibernate学习笔记(原版)

    《马士兵Hibernate学习笔记》是一份深入浅出的教程,旨在帮助初学者掌握Hibernate这一流行的Java持久化框架。Hibernate是一个对象关系映射(ORM)工具,它允许开发者用面向对象的方式来操作数据库,从而减少了传统...

    hibernate学习笔记_北大青鸟课堂笔记全文

    【hibernate学习笔记_北大青鸟课堂笔记全文】 Hibernate是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方案。在Java应用中,尤其是在企业级开发中,它扮演着至关重要的角色,使得我们...

    hibernate4框架学习笔记

    【hibernate4框架学习笔记】 Hibernate是一款强大的ORM(Object-Relational Mapping)框架,它在Java开发中扮演着至关重要的角色,通过提供对象与数据库之间的映射,解决了对象模型和关系模型之间的“阻抗不匹配”...

Global site tag (gtag.js) - Google Analytics