Hibernate:Map和Result Transformer之间的区别

时间:2016-06-30 04:54:59

标签: java hibernate hql

我正在探索从Hibernate返回地图的方法。

我知道我可以用两种方式做到这一点

首先是: 使用地图

String HQL_QUERY =
                "select new map(hp.col1 , hp.col2) from HP hp where hp.col1 in (:Ids)";
            test =
                getSession().createQuery(HQL_QUERY).setParameterList("Ids", ids).list();

其他人正在使用 setResultTransformer

String HQL_QUERY =
            "select hp.col1 , hp.col2 from HP hp where hp.col1 in (:Ids)";
        test =
            getSession().createQuery(HQL_QUERY).setParameter("Ids", ids)
                .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();

在两种方式中,我都得到相同的结果....没有问题。

但是我想问一下使用一个优于其他的优势。

例如,如果您使用map,则必须编写更少的代码,但结果转换器可能更有效(不确定)。

我试图在谷歌上找到它,但没有找到太多。

请帮忙

1 个答案:

答案 0 :(得分:0)

他们只是两种表达同一事物的方式。

以下是来自hibernate源代码的确认:在QueryLoader.java中,它是解析hql查询的类:

    selectNewTransformer = HolderInstantiator.createSelectNewTransformer(
            selectClause.getConstructor(),
            selectClause.isMap(),
            selectClause.isList());

此处selectClause.isMap()将为true(如果您想确认,请查看ConstructorNode.java

然后在HolderInstantiator.java

public static ResultTransformer createSelectNewTransformer(Constructor constructor, boolean returnMaps, boolean returnLists) {
    if ( constructor != null ) {
        return new AliasToBeanConstructorResultTransformer(constructor);
    }
    else if ( returnMaps ) {
        return Transformers.ALIAS_TO_ENTITY_MAP;            
    }
    else if ( returnLists ) {
        return Transformers.TO_LIST;
    }       
    else {
        return null;
    }
}

所以我想hql select子句中的map()更易读,更简洁,使其成为最佳选择。除此之外,场景背后也会发生同样的事情。