gpt4 book ai didi

java - 查询结果上的transformTuple和For循环之间的区别 - Hibernate

转载 作者:行者123 更新时间:2023-12-02 05:53:14 26 4
gpt4 key购买 nike

我的 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 接口(interface)之后,我知道通过这个接口(interface)我可以将 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();

此代码为我提供了带有 for 循环的人员列表。

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

最佳答案

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

  1. 是处理元组的标准 Hibernate 方法, future (中断)有关 HQL 处理方式的更改,返回的元组将由 ResultTransformer 屏蔽,无需更改代码
  2. 为您提供装饰或委托(delegate)的可能性(例如)

所以选择是 ResultTransformer .

关于ResultTransformer.transformList() :

Here we have an opportunity to perform transformation on the query result as a whole

改为 transformTuple您只能操作返回集合的一行。

编辑:
正如上面引用的 javadoc ResultTransformer.transformList()非常清楚:此函数允许修改整个列表以删除重复项、应用类型转换等以及 ResultTransformer.transformList() 的结果转发至Query.list()方法so,返回null来自transformList将返回null来自list() .
就是这样QueryResultTransformer并列。

关于java - 查询结果上的transformTuple和For循环之间的区别 - Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23356783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com