Chinaunix

标题: 用criteria进行关联查询--hibernate 的ResultTransformer [打印本页]

作者: wangyan_230    时间: 2009-05-27 15:29
标题: 用criteria进行关联查询--hibernate 的ResultTransformer

引用
两个实体 Parent(P) 和 Child(C)之间是1:N的关系,现要求符合指定条件的P及所包 含的C
采用hibernate中的Criteria来实现此功能的代码如下:
Java代码
[/url]
  • 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();  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 可用于设置所使用的转化策略。其可设置的值如下:

    Criteria中默认使用的 ResultTransformer 实现策略是 ROOT_ENTITY;但是当调用了方法 setProjection后,会隐式地将策略设置为 PROJECTION。所以,才会出现上例中的两种不同结果。如果希望返回的结果是数组形式的,则可以多加上如下这条语句:
    Java代码
    [url=http://lionheart.javaeye.com/blog/170148#]

  • criteria.setProjection(null);  


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/57965/showart_1946316.html
    作者: ccd135    时间: 2012-08-26 17:29
    它返回值取的是数组中的最后一个对象,也即根实体对象




    欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2