Spring Boot, как вернуть два объекта, один из которых вложен в другой, когда таблица поиска соединяет их? - PullRequest
0 голосов
/ 28 мая 2020

Учитывая представление Spring Boot Java базы данных, содержащей 2 таблицы и таблицу поиска между ними, с отношениями от одного до нескольких между двумя таблицами и таблицей поиска, как можно вернуть две сущности, представляющие основные таблицы в вложенный мод?

На данный момент я могу только понять, как вернуть их рядом, что не является подходящим ответом для того, что требует интерфейс, когда он делает запрос.

Контроллер не учитывается для простоты - он просто возвращает службу 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;
       }
}

Edit: JSON в настоящее время выглядит так:

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

   {
    "foo": "123"
   }
  ]
 ]
]

I хотите, чтобы ответ JSON был таким:

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

  {
   "age: "987",
      CList:[{
             "foo": "654"
            },
            {
             "foo": "321"
            },
            {
             "foo": "123"
            }]
  },
 ] 
]

1 Ответ

1 голос
/ 28 мая 2020

Есть ли причина, по которой вы просто не создаете представление того, как должен выглядеть ваш ответ, и не заполняете это представление своими сущностями? позволяет вам контролировать представление именно так, как вы хотите, вместо того, чтобы смешивать JPA и сериализацию в сущностях.

...