使用Criteria 实现两表的左外连接,返回根对象
(转)
采用hibernate中的Criteria来实现此功能的代码如下:
- Criteria criteria = this.getCriteria(Parent.class);
- //连接关联子对象child,且指定了连接方式为左外连接
- criteria.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN));
- //下面三行代码是用于获取总的记录数
- criteria.setProjection(Projections.rowCount());
- int size = (Integer) criteria.uniqueResult();
- criteria.setProjection(null);
- List results = criteria.list();
上面的results返回的是一个对象数组的list,数组的长度为2,依次是一个Child对象和一个Parent对象,这种返回结果的方式是所需要的;但是,倘若将中间三条获取总记录数的代码去掉,则返回是Parent对象的list,且其相关的Child子对象也没有加载进来。造成这种差别的便是 ResultTransformer
API中对 ResultTransformer 的说明如下:
从上可知,criteria会使用此接口的某一实现来将查询结果转化为返回的list中实际存储的结果。criteria中的方法 setResultTrans 可用于设置所使用的转化策略。其可设置的值如下:
[list]
- CriteriaSpecification.ROOT_ENTITY:就是一个RootEntityResultTransformer 对象,其实现如下:
- public Object transformTuple(Object[] tuple, String[] aliases) {
- return tuple[ tuple.length-1 ];
- }
由代码可知,它返回值取的是数组中的最后一个对象,也即根实体对象,在上例中就相当于返回Parent对象。
- CriteriaSpecification.DISTINCT_ROOT_ENTITY:就是一个 DistinctRootEntityResultTransformer 对象,它的实现与RootEntityResultTransformer相似,只是在其的基础对根实体对象进行了比较,过滤掉了其中相同的对象。
- CriteriaSpecification.ALIAS_TO_ENTITY_MAP:就是一个AliasToEntityMapResultTransformer 对象,其实现如下:
- public Object transformTuple(Object[] tuple, String[] aliases) {
- Map result = new HashMap(tuple.length);
- for ( int i=0; i<tuple.length; i++ ) {
- String alias = aliases[i];
- if ( alias!=null ) {
- result.put( alias, tuple[i] );
- }
- }
- return result;
- }
它是对数组中的每一个对象,以其别名为key,对象本身为value,构成了一个map作为返回值。
- CriteriaSpecification.PROJECTION:就是一个 PassThroughResultTransformer 对象,它就是简单地返回数组本身,即上例中第一种情况。 [/list]
Criteria中默认使用的 ResultTransformer 实现策略是 ROOT_ENTITY;但是当调用了方法 setProjection后,会隐式地将策略设置为 PROJECTION。所以,才会出现上例中的两种不同结果。如果希望返回的结果是数组形式的,则可以多加上如下这条语句:
- criteria.setProjection(null);
- detachedCriteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); //不希望返回数组,返回根对象
使用Criteria 实现两表的左外连接,返回根对象的更多相关文章
- MyBatis 内连接association 左外连接collection
前提条件: 学生表 (多 子表) 年级表(一 主表) 1,第一种情况:先查子表所有 student.sql.xml文件如何配 由于有多表连接,无法把查询结果直接封装成一个实体对象--------& ...
- MySQL之表连接-> 内连接,左外连接,右外链接,全连接
1.首先创建student库 create database student; 2. 在数据库中创建boy表 和 girl表, mysql> create table boy( -> bo ...
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转)
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- 【转】深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
[原文]:http://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. ...
- SQL 四种连接:内连接、左外连接、右外连接、全连接--转载
原文:http://zwdsmileface.iteye.com/blog/2191730 个人理解 内连接(INNER JOIN)(典型的连接运算,使用像 = 或 <> ...
- sql的交叉连接,内连接,左外连接,右外连接,全外连接总结
实践是最好的检验,一直都对这几个连接查询出来的结果有什么不同不大理解,然后自己放一块查询比较了一下,用结果来说话~ 先建两张表如下: t1: id name age 1 张三 18 2 李四 25 t ...
- mysql的内连接,外连接(左外连接,右外连接)巩固
1:mysql的内连接: 内连接(inner join):显示左表以及右表符合连接条件的记录: select a.goods_id,a.goods_name,b.cate_name from tdb_ ...
- 内连接、左外连接、右外连接、全外连接、交叉连接(CROSS JOIN)-----小知识解决大数据攻略
早就听说了内连接与外连接,以前视图中使用过.这次自考也学习了,只是简单理解,现在深入探究学习(由于上篇博客的出现)与实践: 概念 关键字: 左右连接 数据表的连接有: 1.内连接(自然连接): 只有两 ...
- sql左外连接和右外连接的区别例子转摘
sql左外连接和右外连接的区别 两个表:A(id,name)数据:(1,张三)(2,李四)(3,王五)B(id,name)数据:(1,学生)(2,老师)(4,校长) 左连接结果:select A. ...
随机推荐
- 代码编写规范说明书(c#.net与asp.net)
代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...
- ios 视频拼接/合成
上面的图说明的是这个混合的过程,下面放代码: - (void)mergeAndExportVideos:(NSArray*)videosPathArray withOutPath:(NSString* ...
- vue项目目录介绍
Vue项目目录 初始化项目 vue init webpack []projectname] cd [projectname] npm install vue run dev 目录树 +---build ...
- http协议的八种请求类型
GET:向特定的资源发出请求. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源的创建和/或已有资源的修改. OPTIONS: ...
- 凭证(Credential)
在SQL Server中,凭证(Credential)用于把Windows用户的身份验证信息(在Windows环境下,是Windows 用户名和密码)存储在SQL Server实例中,并把该身份验证信 ...
- Linq: Aggregate
Aggregate累加器 今天看东西的时候看见这么个扩展方法Aggregate(累加器)很是陌生,于是乎查了查,随手记录一下. 直接看一个最简答的版本,其他版本基本没什么区别,需要的时候可看一下 pu ...
- 原生JS中DOM节点相关API合集
节点属性 Node.nodeName //返回节点名称,只读 Node.nodeType //返回节点类型的常数值,只读 Node.nodeValue //返回Text或Comment节点的文本值,只 ...
- MongoDB基础教程系列--第九篇 MongoDB 分片
1.分片介绍 分片(sharding)是将数据拆分,将其分散存到不同机器上的过程.MongoDB 支持自动分片,可以使数据库架构对应用程序不可见.对于应用程序来说,好像始终在使用一个单机的 Mongo ...
- java运算符 与(&)、非(~)、或(|)、异或(^)
最近看HashMap源码,遇到了这样一段代码: static final int hash(Object key) { int h; return (key == null) ? 0 : (h = k ...
- Angularjs快速入门(四)-css类和样式
例子: .error{background-color:red;} .warning{background-color:yellow;} <div ng-controller='HeaderCo ...