(转)

引用
两个实体 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. 原生态JS实现banner图的常用所有功能

    虽然,用jQuery实现banner图的各种效果十分简单快捷,但是我今天用css+js代码实现了几个banner图的常用功能,效果还不错. 此次,主要想实现以下功能: 1. banner图循环不间断切 ...

  2. 基于bootstrap的bootstrap-editable插件实现即时编辑功能

    1.引用基本css和js: <link href="bootstrap3/css/bootstrap.min.css" rel="stylesheet" ...

  3. 第一个 lua 程序

    第一个 lua 程序 lua 提供一个交互式编程模式, 直接在命令行输入 lua 开启 $ lua > -- 此处可以输入 lua 程序 lua 脚本执行时的 2 种方式 lua + lua 脚 ...

  4. AngularJS创建新指令directive参数说明

    var myapp = angular.module('myapp', []); myapp.directive('worldname', function() { return { template ...

  5. jQuery选择器与CSS选择器

    1. 通过位置选择的几个操作: :first:默认情况下是相对整个页面来说的第一个,如:li:first表示整个页面的第一个li元素,而ul li:first表示整个页面的第一个li元素,并且是在ul ...

  6. 修改maven本地仓库的默认地址

    由于maven默认仓库地址为C盘,所以缓存jar文件多了会占用掉C盘很多空间,鉴于此可更改maven仓库地址来避免.   1. 打开maven解压后目录,找到conf文件夹中的settion.xml文 ...

  7. 编写一个简单的java服务器程序

    import java.net.*;import java.io.*; public class server{ ); //监听在80端口 Socket sock = server.accept(); ...

  8. 观察者模式(Observer)发布、订阅模式

    观察者模式定义了对象之间一对多的依赖关系,这样一来,当一个对象改变时,他的所有依赖者都会收到通知并自动更新.   模式中的角色 1.抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里 ...

  9. python3 time模块与datetime模块

    time模块 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平 ...

  10. 路由-when-resolve

    文件列表:luyou.html,app.js,home.html,user.html,wy.json luyou.html <!DOCTYPE html> <html ng-app= ...