我有一个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
绑定的方式。