我正在探索从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,则必须编写更少的代码,但结果转换器可能更有效(不确定)。
我试图在谷歌上找到它,但没有找到太多。
请帮忙
答案 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()
更易读,更简洁,使其成为最佳选择。除此之外,场景背后也会发生同样的事情。