`
lionheart
  • 浏览: 91186 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用criteria进行关联查询

阅读更多
问题描述如下:
引用
两个实体 Parent(P) 和 Child(C)之间是1:N的关系,现要求符合指定条件的P及所包 含的C

采用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 的说明如下:
引用
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 对象,其实现如下:
  • 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);
    分享到:
    评论
    1 楼 guomingzhang2008 2013-08-23  
    ,写的很好,攒一个!

    相关推荐

      Criteria连表查询

      Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询

      关联映射hibernate的criteria的用法

      通过该源代码可以详细的了解hibernate的criteria的用法,有助于快速的帮助初学者建立hibernate中面向对象的查询,

      hibernate criteria 分组 排序 关联

      hibernate criteria 分组 排序 关联 hibernate criteria 分组 排序 关联

      自定义查询框架Criteria

      3 也可以直接使用preparestatement进行查询,返回我们想要的数据。 初步版本已经实现,数据库兼容性暂时没时间考虑。目前我们使用的是ORACLE数据库。做了一点兼容mysql和sqlserver ,没时间做进一步的研究。 发布...

      Hibernate 多表连接分页查询示范项目

      Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页

      Oracle Adf级联菜单过滤

      这是Adf多表级联菜单实例其中保存创建Criteria知识,多表关系,以及在Vo中使用vo当前字段过滤结果

      使用Hibernate开发租房系统

      HibernaCte关联映射,HQL实用技术,HQL进阶,Criteria查询

      criteria-builder:动态构建店铺数据查询的实验

      标准构建器 CriteriaBuilder 允许您通过类似 SQL 的语法或 DSL 构建复杂的动态查询,可以查询 Ext.data.Store 中的任何数据,包括关联数据。 有关文档和示例, 。

      Hibernate 中文 html 帮助文档

      7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

      Hibernate参考文档

      7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向...

      Hibernate中文详细学习文档

      7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

      Hibernate_3.2.0_符合Java习惯的关系数据库持久化

      7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

      hibernate 框架详解

      用XML数据进行工作 19.1.1. 指定同时映射XML和类 19.1.2. 只定义XML映射 19.2. XML映射元数据 19.3. 操作XML数据 20. 提升性能 20.1. 抓取策略(Fetching strategies) 20.1.1. 操作延迟加载的关联 ...

      hibernate 体系结构与配置 参考文档(html)

      1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1.... 1.2.2.... 1.2.3.... 1.2.4.... 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射...

      Hibernate+中文文档

      7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

      HibernateAPI中文版.chm

      7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

      Pro JPA 2 Mastering the Java Persistence API free down

      JPA2.0 加入了大量必须的 ORM 映射增强特性,包括:支持通过使用 @ElementCollection 标注来增强 collections, maps 和 lists( 这里不是指实体之间的关联关系 ) 集合,支持 map 的单向 one-to-many 关联 (JPA1.0...

      hibernate3.2中文文档(chm格式)

      7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. ...

      hibernate3.04中文文档.chm

      19.1. 用XML数据进行工作 19.1.1. 指定同时映射XML和类 19.1.2. 只定义XML映射 19.2. XML映射元数据 19.3. 操作XML数据 20. 提升性能 20.1. 抓取策略(Fetching strategies) 20.1.1. 操作延迟加载的关联 ...

      Hibernate教程

      19.1. 用XML数据进行工作 19.1.1. 指定同时映射XML和类 19.1.2. 只定义XML映射 19.2. XML映射元数据 19.3. 操作XML数据 20. 提升性能 20.1. 抓取策略(Fetching strategies) 20.1.1. 操作延迟加载的关联 20.1.2...

    Global site tag (gtag.js) - Google Analytics