Hibernate3 Criteria对象详解

员工表 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语句:

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对象详解的更多相关文章
- jQuery的deferred对象详解
jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...
- Window 对象详解 转自 http://blog.csdn.net/jcx5083761/article/details/41243697
详解HTML中的window对象和document对象 标签: HTMLwindowdocument 2014-11-18 11:03 5884人阅读 评论(0) 收藏 举报 分类: HTML& ...
- jQuery的deferred对象详解(转载)
本文转载自: jQuery的deferred对象详解(转载)
- mvc-servlet---ServletConfig与ServletContext对象详解(转载)
ServletConfig与ServletContext对象详解 一.ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...
- JS中的event 对象详解
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
- JavaWeb学习----JSP内置对象详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- django中request对象详解(转载)
django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函数. ...
- (转)javascript中event对象详解
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
- dom对象详解--document对象(二)
dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...
随机推荐
- python2.7练习小例子(二)
2):题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:2 ...
- php+xdebug+dbgp远程调试(多人)
目录 创建 DBGP 服务 配置 调试 创建 DBGP 服务 到 下载页面,下载 python 版本的 dbgp 到服务器上. 解压后执行 pydbgpproxy. 如果提示找不到 dbgp 模块,则 ...
- Maven之自定义archetype生成项目骨架
Maven之自定义archetype生成项目骨架(一) http://blog.csdn.net/sxdtzhaoxinguo/article/details/46895013
- mac下怎么删除隐藏文件比如 .Trashes文件
U盘和移动硬盘接入Mac时会产生.Trashes,.Spotlight-V100,.fseventsd等文件 每插入Mac一次,都会检查是否有这些文件,如果没有,就会创建这些文件 特别是有时候,在文件 ...
- 07_Linux目录文件操作命令4解压缩,文件查找_我的Linux之路
这一节还是一样学习操作目录文件的命令 在这一节,我会讲到解压压缩tar以及zip命令,以及文本查找命令grep tar 打包压缩命令 tar命令可以为linux的文件和目录创建档案 首先要弄清两个概念 ...
- 一口一口吃掉Hibernate(五)——一对多单向关联映射
版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] 在上一篇博客<一口一口吃掉Hibernate( ...
- 读书学习-Python--描述符(python3)
转自我的知乎文章(https://zhuanlan.zhihu.com/p/32487852) 何为描述符?描述符就是实现了__get__.__set__和__delete__三者中任意一个的类.是用 ...
- vuex存储和本地存储(localstorage、sessionstorage)的区别
1.最重要的区别:vuex存储在内存,localstorage则以文件的方式存储在本地 2.应用场景:vuex用于组件之间的传值,localstorage则主要用于不同页面之间的传值. 3.永久性:当 ...
- DotnetSpider (二) Downloader的设置 Request自定义数据字典
本篇主要分享自定义Downloader和Request信息,实现自定义请求内容,及将自定义内容存储. ** 温馨提示:如需转载本文,请注明内容出处.** 本文连接:http://www.cnb ...
- Django项目实战之用户头像上传与访问
1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> < ...