1.序言
Hibernate框架是目前JavaEE软件开发的企业主流框架,学习Hibernate必然要掌握ORM(对象关系映射Object/Relation Mapping)的概念思想, Hibernate拥有完全的ORM理念,我们在操作数据库时,可以通过面向对象的方式就可以完成数据库的CRUD(创建(Create)、更新(Update)、读取(Read)和删除(Delete))操作。
企业在使用Hibernate进行软件开发进行数据查询时,主要基于HQL(Hibernate 面向对象的查询语言,语法类似SQL)、 Criteria(面向对象的条件查询对象)、SQL(原生态SQL语句)几种方式,本文重点讲解Criteria 这种完全面向对象编程查询方式,详细分析Crieria各种使用与SQL生成关系。
2.Criteria牛刀小试 
Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现、SQL语句如何编写,是Hibernate框架的核心查询对象。
Hibernate 定义了CriteriaSpecification接口规范用来完成面向对象的条件查询,Criteria 就是CriteriaSpecification的子接口。
 2.1创建数据库环境 
我们以部门(Department)和员工(Employee) 案例,来讲解Criteria的详细使用。
部门表 department 
使用mysql5.x数据库 
数据库 hibernate3 
用户名 root 
密码 abc 
部门表 employee 
CREATE TABLE `department` (
   `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
   PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

员工表 department

CREATE TABLE `employee` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(255) default NULL,

`age` int(11) NOT NULL,

`birthday` date default NULL,

`department_id` int(11) default NULL,

PRIMARY KEY  (`id`),

FOREIGN KEY (`department_id`) REFERENCES `department` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2.使用JPA注解配置实体类

部门类 Department

员工类 Employee

2.3使用Crteria查询所有部门和所有员工

2.3.1查询所有部门

产生的SQL语句:

查询所有员工

产生的SQL语句:

当session.createCriteria(实体类.class) 就会产生一条select所有列from 表;SQL语句,查询实体类对应数据表的所有记录,然后我们就可以在这个Criteria对象上进行条件查询、分页查询、多表关联查询、投影查询、子查询等一系列操作……

3.Criteria SQL定制详解

3.1对查询添加条件对象Criterion

org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口,一个单独的查询就是Criterion接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions 工厂类完成的。

Restrictions 提供条件查询方法:

例如:

1、查询姓“张”的所有员工信息

产生的SQL语句:

2、查询年龄大于24的所有员工

产生的SQL语句:

3、查询年龄小于28的姓“王”的员工

产生的SQL语句:

对于多个查询条件,Restrictions提供了逻辑组合查询方法。

and(Criterion lhs, Criterion rhs) 用于生成多个条件and关系SQL语句;

or(Criterion lhs, Criterion rhs) 用于生成多个条件or关系SQL语句;

not(Criterion expression) 用于查询与条件相反的数据,生成not取反查询语句。

3.2分页操作 firstResult和maxResults

Criteria接口提供用于分页查询的方法,实现数据库SQL物理级别的分页操作。

setFirstResult(int firstResult)设置记录的起始位置0代表第一条记录。

setMaxResults(int maxResults)设置查询记录的长度。

例如:我要查询1-10条件记录firstResult为0 ,maxResult为10。

产生的SQL语句:

3.3排序操作 Order

Hibernate提供org.hibernate.criterion.Order用于排序操作, Criteria 接口提供addOrder(Order order)用于生成排序SQL。

例如:查询所有员工信息,按照年龄升序排列。

产生的SQL语句:

3.4多表关联操作 createAlias和createCriteria 

Criteria接口提供createAlias 和 createCriteria 两组方法用于完成多表关联查询。

createAlias(String associationPath, String alias) 采用内连接关联。

createAlias(String associationPath, String alias, int joinType) 可以通过joinType指定连接类型。

createCriteria(String associationPath) 采用内连接关联(返回新的Criteria对象)。

createCriteria(String associationPath, int joinType) 可以通过joinType指定关联类型(返回新的Criteria对象 )。

例如:查询部门为“人力资源部”的所有员工。

方法一:使用createCriteria方法。

产生的SQL语句:

代码中的criteria对象,是针对employee表,criteria.createCriteria(”department”) 就是建立employee表和department表的内连接。返回的是针对department表新的criteria2对象,这时再对criteria2 添加条件,就是查询department部门表的属性,而不是employee的属性了。

方法二:使用createAlias 方法。

使用createAlias方法不会像createCriteria那样返回一个新的Criteria对象,alias只是对关联表进行别名设置,通过别名引用设置属性。

产生的SQL语句:

3.5.投影、分组查询 Projection

在实际开发中,进行查询是:可能只需要返回表中的指定列信息(投影)或者进行统计查询(count、avg、sum、min、max),Criteria接口提供setProjection(Projection projection)方法用于实现投影查询操作。

org.hibernate.criterion.Projections工厂类用于返回Projection投影查询对象。

例如: 1. 查询员工表的name和age属性。

产生的SQL语句:

Projections.property(属性名)也可以写为Property.forName(属性名 )。

2.查询员工的总数量。

Projections提供了分组函数的查询方法:

rowCount() 查询记录总数量;

count(String propertyName) 统计某列数量;

countDistinct(String propertyName) 统计某列数量(排除重复);

avg(String propertyName) 统计某列平均值;

sum(String propertyName) 对某列值求和;

max(String propertyName) 求某列最大值;

min(String propertyName) 求某列最小值。

产生的SQL语句:

3.查询每个部门的员工数量(输出部门的编号和数量 )。

Projections提供groupProperty(String propertyNam

-e)用于执行分组操作。

产生的SQL语句:

3.6. 设置结果集封装策略 ResultTransformer

刚刚说了投影操作的使用,其实在Hibernate内部投影查询是会影响到结果集的封装策略的。先用HQL举例说明:

session.createQuery(”from Employee”).list(); 返回 List

session.createQuery(”select count(e) from Employee e”).list(); 返回List

session.createQuery(”select name,age from Employee”).list(); 返回List

从这几个例子我们不难发现,如果没有指定select语句(没有投影),那么将返回表中的所有字段,返回结果会被封装到Entity实体对象Employee中,一但提供select语句(投影)后,返回的结果类型,将不再封装到Employee对象,而是根据投影的实际类型返回,这就是投影对结果封装策略的影响。

我们再来看之前写过的Criteria 查询案例:

session.createCriteria(Employee.class).list();返回 List

session.createCriteria(Employee.class).setProjection(

Projections.projectionList()

.add(Property.forName(”name”))

.add(Property.forName(”age”))); 返回 List

投影之后,返回的结果将不再被封装到Employee对象中,这是为什么呢?

我们一起来看看 Criteria的接口定义,不难发现在Criteria接口中提供了一个setResultTransformer(ResultTransformer resultTransformer),这个ResultTransformer就是结果集转换策略接口,在Criteria的父接口中CriteriaSpecification定义了几个ResultTransformer的常用实现。

ALIAS_TO_ENTITY_MAP 将结果集封装到Map对象;

ROOT_ENTITY 将结果集封装到根实体对象;

DISTINCT_ROOT_ENTITY 将结果集封装到不重复的根实体对象;

PROJECTION 根据投影的结果类型自动封装;

当进行投影查询时,结果的封装策略由ROOT_ENTITY 变为了PROJECTION, 所以是根据查询数据进行封装,而不是封装到根对象。

了解上面原理后,即使只查询name和age属性,也可以封装成List集合。

使用AliasToBeanResultTransformer 修改结果封装策略,AliasToBeanResultTransformer 会根据返回列自动匹配类中属性名,完成封装。

产生的SQL语句:

from:http://bbs.itcast.cn/article-211-1.html

Hibernate3 Criteria对象详解的更多相关文章

  1. jQuery的deferred对象详解

    jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...

  2. Window 对象详解 转自 http://blog.csdn.net/jcx5083761/article/details/41243697

    详解HTML中的window对象和document对象 标签: HTMLwindowdocument 2014-11-18 11:03 5884人阅读 评论(0) 收藏 举报 分类: HTML& ...

  3. jQuery的deferred对象详解(转载)

    本文转载自: jQuery的deferred对象详解(转载)

  4. mvc-servlet---ServletConfig与ServletContext对象详解(转载)

    ServletConfig与ServletContext对象详解 一.ServletConfig对象    在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...

  5. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

  6. JavaWeb学习----JSP内置对象详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

  8. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  9. dom对象详解--document对象(二)

       dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...

随机推荐

  1. POJ-2299 Ultra-QuickSort---树状数组求逆序对+离散化

    题目链接: https://vjudge.net/problem/POJ-2299 题目大意: 本题要求对于给定的无序数组,求出经过最少多少次相邻元素的交换之后,可以使数组从小到大有序. 两个数(a, ...

  2. MySQL 内连接与外连接

    1.内连接 MySQL中,join,cross join,inner join 是等价的. 2.外连接 2.1 左外连接 left join 2.2 右外连接  right join 3.连接条件 使 ...

  3. drool-6.5的自学demo

    先丢代码地址 https://gitee.com/a247292980/drools 再丢pom.xml <project xmlns="http://maven.apache.org ...

  4. ubuntu14.04 python2.7 安装配置OpenCV3.0

    环境:ubuntu14.04  python2.7 内容:安装并配置OpenCV3.0 今天按照OpenCV官网上的步骤装了OpenCV但是,装好之后python提示“No module named ...

  5. ACM Ignatius and the Princess II

    Problem Description Now our hero finds the door to the BEelzebub feng5166. He opens the door and fin ...

  6. Elasticsearch+Hbase实现海量数据秒回查询

    ---------------------------------------------------------------------------------------------[版权申明:本 ...

  7. 拦截器(Interceptor)中的invocation.invoke()

    关于在Struts2的自定义的验证拦截器(Interceptor)中的invocation.invoke()是什么意思? package com.xjtu.interceptor; import co ...

  8. 20160223.CCPP体系详解(0033天)

    程序片段(01):MyArray.h+MyArray.c+main.c 内容概要:数组库 ///MyArray.h #pragma once #define DT int//类型通用 typedef ...

  9. AndroidStudio中导入SlidingMenu报错解决方案

    ----------------------------------------------------------------------------------------------[版权申明: ...

  10. [boost] Windows下编译

    编译命令 32位 编译 bjam variant=release link=static threading=multi runtime-link=static -a -q bjam variant= ...