我的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()
?当我应该使用collection
和transformList()
时,我将如何决定使用哪个?
答案 0 :(得分:2)
通常在结果方面没有差异,但使用ResultTransformer
:
所以选择是ResultTransformer
。
关于ResultTransformer.transformList()
:
我们有机会对查询执行转换 结果整体
而不是transformTuple
,你只能操纵一行返回的集合。
修改强>
如上所述,ResultTransformer.transformList()
的javadoc非常清楚:此函数允许修改整个列表以删除重复,应用类型转换等等,ResultTransformer.transformList()
的结果转发到Query.list()
方法是这样,从null
返回transformList
,从null
返回list()
。
这就是Query
和ResultTransformer
绑定的方式。