Java @SqlResultsMapping将内部类绑定到targetclass

Java @SqlResultsMapping将内部类绑定到targetclass,java,spring-boot,spring-data-jpa,jpa-2.1,sqlresultsetmapping,Java,Spring Boot,Spring Data Jpa,Jpa 2.1,Sqlresultsetmapping,在我的项目中,我创建了一个包含多个联接的视图。以下是来自视图的查询的一部分 a.id, b.object1, b.object2, b.object3, case when (c.type = 'qrt' then c.object4 else b.object4) end object4, case when(c.type = 'qrt' then c.object5 else b.object5) end object5 from A a left join B b on b.a_id

在我的项目中,我创建了一个包含多个联接的视图。以下是来自视图的查询的一部分

a.id,
b.object1,
b.object2,
b.object3,
case when (c.type = 'qrt' then c.object4 else b.object4) end object4, 
case when(c.type = 'qrt' then c.object5 else b.object5) end object5 
from A a
left join B b on b.a_id = a.id
left join c c on c.b_id = b.id
此查询将返回如下数据:

id   object1    object2    object3    object4     object5
1    a1         b1         c1         d1          e1
1    a1         b1         c1         d2          e2
2    a2         b2         c2         d3          e3
2    a2         b2         c2         d4          d5
我想将结果映射到以下POJO类

public class Example{

private Integer id;
private String object1;
private String object2;
private String object3;
List<InnerExample> innerExample;
}


public class InnerExample{
private String object4;
private String object5;
}

身份证件
名称
反对意见1
反对意见2
反对意见3
反对意见4
反对意见5
反对意见4
反对意见5
身份证件
名称
反对意见1
反对意见2
反对意见3
反对意见4
反对意见5
反对意见4
反对意见5

如果您使用的是Spring boot JPA,您可以直接将查询结果转换为您编写的任何存储库类中的一个类

@存储库 公共接口BRepository扩展了JPapository{

}

另外,在Example和InnerExample类中添加以下构造函数


请记住,这里我使用的是List而不是InnerExample,因为我很不确定查询是如何工作的,并给出了List输出。但您可以相应地修改。

我需要列表,不能使用JPA存储库类。我必须使用NativeSQLQuery和EntityManager来完成这项工作。如果我必须只使用一个对象,我可以这样做,但不能确定列表。对不起,但我仍然无法理解查询。-------case when(c.type='qrt'然后是c.object4 else b.object4)end object4,case when(c.type='qrt'然后是c.object5 else b.object5)end object5------------------这将只返回InnerExample而不是列表。这个名单是怎么形成的?我唯一能想到的是整个查询返回列表,而不是示例。我用SQL查询结果编辑了一个问题。希望这有助于理解这个问题。这就是我所说的。如果我们的查询结果是这样的,那么SQL会将其视为列表,它不会在单个答案中处理具有相同id的结果。这样想,您可以将答案的每一行转换为POJO。如果您仍然需要InnerExample作为列表,那么您需要在执行查询后更改查询或修改结果。是的,我同意,我必须手动执行,但我想如果有人自定义了@SqlResultSetMapping,那么我可以从他们那里获得帮助。因为您的POJO不是实体,我认为您必须手动执行映射,很难,这很乏味。需要3个比较器。即使是投影,情况也是如此。
@Query("SELECT new path.from.src.folder.Example(" + 
       "a.id, b.object1,b.object2, b.object3, " + 
       "new path.from.src.folder.Example.InnerExample(" +
       "case when(c.type='qrt' then c.object4 else b.object4) end object4,"+ 
       "case when(c.type='qrt' then c.object5 else b.object5) end object5" + 
       "))" + 
       "from AEntity as a " + 
       "left join BEntity as b on b.a_id = a.id " + 
       "left join c c on c.b_id = b.id ")
Example customQueryJoiningAandBandCtable();
public Example(Integer id, String object1, String object2, String object3, InnerExample innerExample) {
    this.id = id;
    this.object1 = object1;
    this.object2 = object2;
    this.object3 = object3;
    this.innerExample = innerExample;   }

public InnerExample(String object4, String object5) {
    this.object4 = object4;
    this.object5 = object5;   
}