如何在Hibernate中返回特定类型的列表而不是List<Object[]>?

2022-09-03 17:31:36

我有类树:

classA {  
      classB b;  
      classC c;
      .....
} 

我有这样的HQL查询:

SELECT a.field1, b.field2, c.field3, c.field4
FROM a LEFT OUTER JOIN b ON a.id = b.fk
       LEFT OUTER JOIN c ON b.id = c.fk 

此查询返回 。List<Object[]>

是否可以将返回的数据强制转换为以下类:

classD {
    Type1 fiedl1;
    Type2 field2;
    Type3 field3;
}

那么可以通过Hibernate进行铸造,还是我需要手动完成所有铸造?


答案 1

JPA 查询中有不同类型的选择。您当前使用 Array 作为返回类型,您需要的是构造返回类型。以下是实现此目的的方法:

String queryStr =
    "select NEW package.YourDefinedCustomClass(
     a.field1, b.field2, c.field3, c.field4) from a left outer join b 
     on a.id=b.fk left outer join c on b.id=c.fk";

TypedQuery<YourDefinedCustomClass> query =
    em.createQuery(queryStr, YourDefinedCustomClass.class);

List<YourDefinedCustomClass> results = query.getResultList();

基本上有两件事:

  1. 自定义类必须是结果返回类型
  2. 自定义类必须具有一个构造函数,该构造函数采用您在查询字符串中定义的结果值。

阅读有关 JPA2 查询中的选择的更多信息。


答案 2

如果你真的确定你可以做类型转换。

 List<classD> newlist = ...;
 for(Object o : list){
      newlist.add((classD) o);
 }

不过要小心

所以是的。手动铸造。(注:带数组(可直接施放)


推荐