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. 实验:利用ASMLib创建ASM磁盘

    环境:RHEL 6.5 + Oracle 11.2.0.4 RAC(2 nodes) 目的:在实验环境使用ASMLib配置共享ASM磁盘,虽然我们已经不建议使用ASMLib进行绑盘,但是无奈有客户是这 ...

  2. Json数组删除

    有一个json数组,{'people':[{'name':'jetty','sex':'男'},{'name':'lily','sex':'女'}]} 有一个json:var aa={'name':' ...

  3. (转载)JVM知识小集

    1. 内存模型以及分区,需要详细到每个区放什么. 2. 堆里面的分区:Eden,survival from to,老年代,各自的特点. 3. 对象创建方法,对象的内存分配,对象的访问定位. 4. GC ...

  4. samba服务器配置过程

    SAMBA服务器配置 yum install samba samba-client samba-swat 改变文件权限及用户 vi /etc/samba/smb.conf d+G全删注释 复制下面代码 ...

  5. python if判断语句&计算

    python对缩进要求严格,代码块里的缩进必须一样,可以常用 tab键  表示4个空格 if 条件: 代码块 else: if判断语句如下: 1 print("吃饭,喝水,回家") ...

  6. Go 错误处理

    Go 语言通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型,这是它的定义: type error interface { Error() string } 我们可以在编码 ...

  7. 自己创建一个android studio在线依赖compile

    我正参加2016CSDN博客之星评选麻烦帮下 奖品我随机送给投票者(写一个随机数抽取) http://blog.csdn.net/vote/candidate.html?username=qfanmi ...

  8. PHP Ajax JavaScript Json 实现天气信息获取

    使用第三方服务 间接方式 思路 使用到的服务 实现代码 前端完整代码 总结 要在自己的网站上添加一个天气预报功能,是一个很普通的需求,实现起来也不是很难.今天来介绍几个简单的方法. 使用第三方服务 有 ...

  9. Studio 一些使用

    1,配置: W:\android_tools\AndroidStudio2.1.3_SDK\android-studio-ide-141.2456560-windows\android-studio\ ...

  10. Win7下安装linux虚拟机

    关于如何在Win7下搭建linux学习环境,特在此分享下. 一.工具 1.VMware-workstation-full-9.0.0-812388.exe       下载地址:http://pan. ...