查询结果中的转换元组和For循环之间的区别 - Hibernate

时间:2014-04-29 06:07:22

标签: java hibernate hql

我的HQL为select p,c from Person p,ContactCard c where c.fk_pid=p.id我使用以下代码将此查询作为HQL执行:

List<Person> personsWithContactCard = new ArrayList<Person>();
List<object[]> quryResult =  new ArrayList<object[]>();
String qry = "select p,c from Person p,ContactCard c where c.fk_pid=p.id";              
quryResult = session.createQuery(qry).list();

for(object[] obj : quryResult ) 
{
 Person person = new Person();
 person = (Person)obj[0];
 person.setContactCard = (ContactCard )obj[1];
 personsWithContactCard.add(person);
 person=null;
}

通过在对象数组列表中获取查询结果并在查询结果上循环,我填写了人员列表。

但是在阅读了ResultTransformer接口之后我才知道通过这个接口,我可以将queryResult转换为所需的列表,所以我将代码更改为:

String qry = "select p,c from Person p,ContactCard c where c.fk_pid=p.id";

personsWithContactCard = session.createQuery(qry).setResultTransformer(new ResultTransformer() {                
@Override
public Object transformTuple(Object[] tuple, String[] aliases) 
{
 Person person = new Person();
 person = (Person)obj[0];
 person.setContactCard = (ContactCard )obj[1];
 return person ;
}

@Override
public List transformList(List collection) 
{
return collection;
}
}).list();

此代码为我提供了用于循环的人员列表。

所以我的问题是: transformTuple和For循环有什么区别? 两者在性能和处理意义上是否相同? 根据性能哪个会更好?

transformList()的用途是什么?

更新:

在理解了{@ 1}}的使用后,正如@bellabax给出的答案所解释的那样,我在代码中做了一个小改动,如下所示:

ResultTransformer

我更改了personsWithContactCard = session.createQuery(qry).setResultTransformer(new ResultTransformer() { @Override public Object transformTuple(Object[] tuple, String[] aliases) { Person person = new Person(); person = (Person)obj[0]; person.setContactCard = (ContactCard )obj[1]; return person ; } @Override public List transformList(List collection) { return null; } }).list(); 方法以返回transformList()如果我执行此代码,我将获得null null列表。为什么personsWithContactCard方法在我不使用时需要返回transformList()?当我应该使用collectiontransformList()时,我将如何决定使用哪个?

1 个答案:

答案 0 :(得分:2)

通常在结果方面没有差异,但使用ResultTransformer

  1. 是处理元组的标准Hibernate方法,以及有关如何处理HQL的未来(中断)更改以及返回的元组将被ResultTransformer屏蔽而不需要更改代码
  2. 为您提供装饰或委派的可能性(例如)
  3. 所以选择是ResultTransformer

    关于ResultTransformer.transformList()

      

    我们有机会对查询执行转换   结果整体

    而不是transformTuple,你只能操纵一行返回的集合。

    修改
    如上所述,ResultTransformer.transformList()的javadoc非常清楚:此函数允许修改整个列表以删除重复,应用类型转换等等,ResultTransformer.transformList()的结果转发到Query.list()方法是这样,从null返回transformList,从null返回list()
    这就是QueryResultTransformer绑定的方式。