`

Hibernate 使用 criteria(3)

阅读更多
用criteria进行关联查询--hibernate 的ResultTransformer



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

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

Java代码
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 可用于设置所使用的转化策略。其可设置的值如下:

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

    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 对象,其实现如下:
    Java代码
    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;   

    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 对象,它就是简单地返回数组本身,即上例中第一种情况。

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

Java代码
criteria.setProjection(null); 


分享到:
评论

相关推荐

    Hibernate中Criteria的完整用法

    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。通过 Criteria,可以根据实际情况灵活地组装查询条件,以满足复杂的查询需求。 Hibernate 的 Criteria 是...

    Hibernate的Criteria用法总结.doc

    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。Criteria crit = session.createCriteria(User.class); crit.add(Restrictions.eq("name", "John")); List...

    hibernateCriteria查询

    ### Hibernate Criteria 查询详解 #### 一、概述 Hibernate Criteria 查询是一种强大的对象化查询方式,它为开发者提供了一种灵活而直观的方式来构建复杂的查询逻辑。与传统的SQL查询相比,Criteria查询更加面向...

    Hibernate的Criteria用法总结

    本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由CriteriaSpecification接口作为基础,它有两个主要实现:Criteria和DetachedCriteria。Criteria用于在线查询,直接与Hibernate Session关联,而...

    Hibernate中Criteria的使用

    Hibernate 中 Criteria 的使用 Hibernate 中 Criteria 的使用是 Hibernate 框架中的一种查询机制,对于研究 Hibernate 源码有一些作用。在查询方法设计上可以灵活地根据 Criteria 的特点来方便地进行查询条件的组装...

    Hibernate-Criteria_模糊查询

    3. **添加模糊查询条件**:使用Criteria的add(Restrictions.like())方法,其中参数分别为属性名和模糊查询字符串。注意,字符串中的“%”符号表示任意字符匹配,可以根据需求放在字符串的开头、结尾或中间。 4. **...

    Hibernate Criteria 排序的問題

    本文将围绕给定的代码片段,深入探讨Hibernate Criteria API中排序功能的使用方法与注意事项。 #### 二、基础知识回顾 在开始之前,我们先简单回顾一下Hibernate Criteria API的基础知识: - **Criteria API**:...

    Hibernate中Criteria的完整用法.docx

    本文将对 Hibernate 中 Criteria 的用法进行总结,涵盖 Criteria 和 DetachedCriteria 的差异、Criterion 和 Projection 的使用方法等。 Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供...

    hibernate如何使用criteria联合查询 group by 的语句

    这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友

    Hibernate中Criteria的用法

    Hibernate 中 Criteria 的用法 Hibernate 中 Criteria 的用法是 Hibernate 框架中的一种查询机制,它提供了灵活的查询方式,可以根据不同的条件进行查询。Criteria 查询机制主要包括 QBE(Query By Example)、QBC...

    Hibernate criteria基本操作

    Hibernate Criteria 是一种在Java应用程序中使用Hibernate ORM框架执行SQL查询的方式。它提供了一种面向对象的方式来构建查询,使得代码更加可读和易于维护。Criteria API 提供了多种方法来构建复杂的查询,包括添加...

    Hibernate-Criteria 模糊查询

    在Hibernate中,`Criteria`接口支持使用`Expression`类及其子类来实现模糊查询。例如,使用`like`表达式来进行模糊匹配: ```java Criteria criteria = session.createCriteria(User.class); criteria.add...

    Hibernate的Criteria文档

    3. 添加`Criterion`实例以定义查询条件,可以使用`Restrictions`类的静态方法。 4. 设置`Projection`以进行报表查询,如果需要的话。 5. 添加排序规则(`Order`),如果需要对结果进行排序。 6. 执行`Criteria`查询...

    关联映射hibernate的criteria的用法

    与HQL(Hibernate Query Language)相比,Criteria API更易于理解和使用,尤其在处理复杂的查询条件时。它通过对象来表示查询条件,使得代码更具有可读性和可维护性。 ### 2. 创建Criteria查询 首先,我们需要从`...

    Hibernate的Criteria用法

    要开始使用Criteria,你需要在Hibernate的Session中调用`createCriteria()`方法,传入你想查询的实体类的Class对象。例如,如果你要查询Person实体,你会这样做: ```java Criteria c = session.createCriteria...

Global site tag (gtag.js) - Google Analytics