我有一个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
:
- 是标准的Hibernate方法,用于处理元组和关于如何处理HQL的未来(中断)更改,并且返回的元组将被ResultTransformer屏蔽而不更改代码
- 给你装饰或委派的可能性(例如)
所以选择CCD_ 13
关于ResultTransformer.transformList()
:
在这里,我们有机会对查询执行转换整体结果
相反,在transformTuple
中,您只能操作返回集的一行。
编辑:
如上所述,ResultTransformer.transformList()
的javadoc非常清楚:该函数允许修改整个列表以删除重复、应用类型转换等,并且ResultTransformer.transformList()
的结果被转发到Query.list()
方法,因此,从transformList
返回null
,而从list()
返回null
这就是CCD_ 23和CCD_。