(转)

引用
两个实体 Parent(P) 和 Child(C)之间是1:N的关系,现要求符合指定条件的P及所包 含的C

采用hibernate中的Criteria来实现此功能的代码如下:

Java代码
  1. Criteria criteria = this.getCriteria(Parent.class);
  2. //连接关联子对象child,且指定了连接方式为左外连接
  3. criteria.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN));
  4. //下面三行代码是用于获取总的记录数
  5. criteria.setProjection(Projections.rowCount());
  6. int size = (Integer) criteria.uniqueResult();
  7. criteria.setProjection(null);
  8. List results = criteria.list();

上面的results返回的是一个对象数组的list,数组的长度为2,依次是一个Child对象和一个Parent对象,这种返回结果的方式是所需要的;但是,倘若将中间三条获取总记录数的代码去掉,则返回是Parent对象的list,且其相关的Child子对象也没有加载进来。造成这种差别的便是 ResultTransformer 
API中对 ResultTransformer 的说明如下:

引用
Implementors define a strategy for transforming criteria query results into the actual application-visible query result list.

从上可知,criteria会使用此接口的某一实现来将查询结果转化为返回的list中实际存储的结果。criteria中的方法 setResultTrans 可用于设置所使用的转化策略。其可设置的值如下: 
[list]

  • CriteriaSpecification.ROOT_ENTITY:就是一个RootEntityResultTransformer 对象,其实现如下:
Java代码
  1. public Object transformTuple(Object[] tuple, String[] aliases) {
  2. return tuple[ tuple.length-1 ];
  3. }

由代码可知,它返回值取的是数组中的最后一个对象,也即根实体对象,在上例中就相当于返回Parent对象。

  • CriteriaSpecification.DISTINCT_ROOT_ENTITY:就是一个 DistinctRootEntityResultTransformer 对象,它的实现与RootEntityResultTransformer相似,只是在其的基础对根实体对象进行了比较,过滤掉了其中相同的对象。
  • CriteriaSpecification.ALIAS_TO_ENTITY_MAP:就是一个AliasToEntityMapResultTransformer 对象,其实现如下:
Java代码
  1. public Object transformTuple(Object[] tuple, String[] aliases) {
  2. Map result = new HashMap(tuple.length);
  3. for ( int i=0; i<tuple.length; i++ ) {
  4. String alias = aliases[i];
  5. if ( alias!=null ) {
  6. result.put( alias, tuple[i] );
  7. }
  8. }
  9. return result;
  10. }

它是对数组中的每一个对象,以其别名为key,对象本身为value,构成了一个map作为返回值。

  • CriteriaSpecification.PROJECTION:就是一个 PassThroughResultTransformer 对象,它就是简单地返回数组本身,即上例中第一种情况。 [/list] 
    Criteria中默认使用的 ResultTransformer 实现策略是 ROOT_ENTITY;但是当调用了方法 setProjection后,会隐式地将策略设置为 PROJECTION。所以,才会出现上例中的两种不同结果。如果希望返回的结果是数组形式的,则可以多加上如下这条语句:
Java代码
  1. criteria.setProjection(null);
  2. detachedCriteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); //不希望返回数组,返回根对象
 
 

使用Criteria 实现两表的左外连接,返回根对象的更多相关文章

  1. MyBatis 内连接association 左外连接collection

    前提条件: 学生表 (多  子表) 年级表(一  主表) 1,第一种情况:先查子表所有 student.sql.xml文件如何配 由于有多表连接,无法把查询结果直接封装成一个实体对象--------& ...

  2. MySQL之表连接-> 内连接,左外连接,右外链接,全连接

    1.首先创建student库 create database student; 2. 在数据库中创建boy表 和 girl表, mysql> create table boy( -> bo ...

  3. 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转)

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  4. 【转】深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    [原文]:http://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.    ...

  5. SQL 四种连接:内连接、左外连接、右外连接、全连接--转载

    原文:http://zwdsmileface.iteye.com/blog/2191730 个人理解 内连接(INNER JOIN)(典型的连接运算,使用像   =   或   <>   ...

  6. sql的交叉连接,内连接,左外连接,右外连接,全外连接总结

    实践是最好的检验,一直都对这几个连接查询出来的结果有什么不同不大理解,然后自己放一块查询比较了一下,用结果来说话~ 先建两张表如下: t1: id name age 1 张三 18 2 李四 25 t ...

  7. mysql的内连接,外连接(左外连接,右外连接)巩固

    1:mysql的内连接: 内连接(inner join):显示左表以及右表符合连接条件的记录: select a.goods_id,a.goods_name,b.cate_name from tdb_ ...

  8. 内连接、左外连接、右外连接、全外连接、交叉连接(CROSS JOIN)-----小知识解决大数据攻略

    早就听说了内连接与外连接,以前视图中使用过.这次自考也学习了,只是简单理解,现在深入探究学习(由于上篇博客的出现)与实践: 概念 关键字: 左右连接 数据表的连接有: 1.内连接(自然连接): 只有两 ...

  9. sql左外连接和右外连接的区别例子转摘

    sql左外连接和右外连接的区别   两个表:A(id,name)数据:(1,张三)(2,李四)(3,王五)B(id,name)数据:(1,学生)(2,老师)(4,校长) 左连接结果:select A. ...

随机推荐

  1. jQuery / zepto ajax 全局默认设置

    jQuery / zepto 的 $.ajax 方法需要配置很多选项, 有些是很常用的每个 ajax 请求都要用到的, 可以全局设置, 避免每次都写. 注意: 此处用的 jQuery 版本是 1.8. ...

  2. java多线程基本概述(三)——同步块

    1.1.synchronized方法的弊端 package commonutils; public class CommonUtils { public static long beginTime1; ...

  3. python安装win32api pywin32 后出现 ImportError: DLL load failed

    ImportError: DLL load failed: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\x ...

  4. 图解WebGL&Three.js工作原理

    “哥,你又来啦?”“是啊,我随便逛逛.”“别介啊……给我20分钟,成不?”“5分钟吧,我很忙的.”“不行,20分钟,不然我真很难跟你讲清楚.”“好吧……”“行,那进来吧,咱好好聊聊” 一.我们讲什么? ...

  5. 【代码学习】GD库中添加图片水印

    函数 getimagesize() bool imagecopymerge( resource dst_im, resource src_im, int dst_x, int dst_y, int s ...

  6. 天方夜谈·数据结构·Queue

    "我在想Y的时候不能想X....." 什么叫做Queue(队列)?"队列是项的集合,对于每一项x和y,如果x在y之前离开对头,那么x一定在y之前进入队列--Sesh·Ve ...

  7. 使用Nodejs进行反向代理

    在实际工程开发中,会有前后端分离的需求. 为了平滑的完成前端请求到后端各个独立服务,需要一个中间件实现请求转发的功能,利用Nginx可以实现,在这里,使用nodejs实现一个反向代理服务器.   实际 ...

  8. express4.x的使用

    ①.安装 npm install -g  express   ②.创建应用 express [目录] 会在目录下生成 node_modules, 存放所有的项目依赖库.(每个项目管理自己的依赖,与Ma ...

  9. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  10. CentOS编译安装emacs并配置

    Liunxs中CentOS系列一向以稳定为目标,然而也会存在版本太旧的问题,emacs就是其中的一个,目前emacs都发行到25.2了,而CentOS上的emacs版本却还是23.1.所以需要下载源代 ...