我有一个select p,c from Person p,ContactCard c where c.fk_pid=p.id的HQL,我使用以下代码作为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()的用途是什么?

更新:

在理解了ResultTransformer的用法(如@bellabax给出的答案中所述)后,我对代码做了如下小改动:

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如果执行此代码,则得到的personsWithContactCard列表为空。为什么我不使用transformList()方法时需要返回collection?当我应该使用transformList()transformTuple()时,我将如何决定使用哪个?

最佳答案

通常在结果方面没有区别,但是使用ResultTransformer


是用于处理元组和将来(中断)更改的标准Hibernate方法,有关如何处理HQL,返回的元组将由ResultTransformer屏蔽,而无需更改代码
给您装饰或委派的可能性(例如)


所以选择是ResultTransformer

关于ResultTransformer.transformList()


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


相反,在transformTuple中,您只能操纵返回的行的一行。

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

07-24 21:17