Spring Boot如何通过查找表将两个实体嵌套在一起而返回另一个实体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot如何通过查找表将两个实体嵌套在一起而返回另一个实体?相关的知识,希望对你有一定的参考价值。

给出了一个包含两个表和一个查询表的数据库的Spring Boot Java表示,两个表之间以及一个查询表之间具有一对多关系,如何以嵌套方式返回代表主表的两个实体?

目前,我只能弄清楚如何并排返回它们,这对于前端发出请求时所需要的内容不是一个合适的响应。

为简便起见,省略了控制器-它仅返回服务getAWithCNestedInIt()。

    @Entity
    class A
       @Id
       @GenereatedValue(strategy = "GenerationType.IDENTITY")
       @Column("a_id")
       Integer A_Id;

       Integer age;

       // Relationship with lookup table:
       @JsonIgnore
       @ToString.Exclude
       @OneToMany(mappedBy = "BLinkToA")
       private Set <B> ASetLinkToB;
    

    @Entity
    // look-up table 
    class B 
       @EmbeddedId
       BKey id;

       // Foreign keys to A and C
       @ManyToOne
       @MapsId("fk_A_Id")
       @JoinColumn("fk_A_Id")
       private A BLinkToA; 

       @ManyToOne
       @MapsId("fk_C_Id")
       @JoinColumn("fk_C_Id")
       private C BLinkToC; 
    

    // B Key class here taken out to make code shorter.

    @Entity
    class C  

       @Id
       @GenereatedValue(strategy = "GenerationType.IDENTITY")
       @Column("c_id")
       Integer C_Id;

       Integer foo;

       // Relationship with lookup table:
       @JsonIgnore
       @ToString.Exclude
       @OneToMany(mappedBy = "BLinkToC")
       private Set <B> CSetLinkToB;
    

    // A Controller calls and returns the following service method when URI "/getAandC" is hit
    @Service 
    class TheServiceClass 
       public List<List<Object>> getAWithCNestedInIt() 

          List <A> aList = new ArrayList<A>();
          List<List <C>> cList = new ArrayList<C>();

          List<List<Object>> combinedList = new ArrayList <>(); 
          // Assume this method does work to get the desired aList and cList here
          /////////                                                     /////////

          int i = 0;

          for (A a: aList)
             List<Object> instanceOfBoth = new ArrayList<>();

             instanceOfBoth.add(a);
             instanceOfBoth.add(cList.get(i));

             combinedList.add(instanceOfBoth);
             i++;
          
         return combinedList;
       

编辑:JSON当前看起来像这样:

[[ 
   "age: "123"
  ,
  [
    "foo": "456"
   ,
   
    "foo": "789"
   ]
 ],
 [ 
   "age": "987"
  ,
  [
   
    "foo": "654"
   ,
   
    "foo": "321"
   ,

   
    "foo": "123"
   
  ]
 ]
]

我希望JSON响应是这样:

[[
  
   "age: "123",
      CList:[
             "foo": "456"
            ,
            
             "foo": "789"
            ]
  ,

  
   "age: "987",
      CList:[
             "foo": "654"
            ,
            
             "foo": "321"
            ,
            
             "foo": "123"
            ]
  ,
 ] 
]
答案
您是否有理由不简单地创建响应外观的表示形式并使用您的实体填充该表示形式?

public class ATransferObject private Integer age; private List<CTransferObject> CList; // Methods omitted public class CTransferObject private Integer foo; // Methods omitted

这使您的实体与JSON表示分离,而是让您完全按照所需的方式控制表示,而不是在实体中混合JPA和序列化。

以上是关于Spring Boot如何通过查找表将两个实体嵌套在一起而返回另一个实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 为嵌套实体配置 Jackson 反序列化器

Spring Boot-------JPA——EntityManager构建通用DAO

Spring Boot 和 Mongo - 如何通过嵌套属性进行查询

如何在spring boot中开发JPA双向实体

如何修复不兼容的外键约束spring boot

用于过滤两个子实体的 Spring Boot 规范