transformTuple和For循环在查询Result-Hibernate上的区别



我有一个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()有什么用?

更新:

在理解了@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。如果我执行此代码,我将得到空的personsWithContactCard列表。为什么transformList()方法需要在我不使用它的情况下返回collection?当我应该使用transformList()transformTuple()时,意味着我如何决定使用哪一个?

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

  1. 是标准的Hibernate方法,用于处理元组和关于如何处理HQL的未来(中断)更改,并且返回的元组将被ResultTransformer屏蔽而不更改代码
  2. 给你装饰或委派的可能性(例如)

所以选择CCD_ 13

关于ResultTransformer.transformList():

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

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

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

相关内容

最新更新