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;
}