spring 如何从链接两个实体/表的GET中打印响应?

2exbekwf  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(46)

你好=]我是由于一个活动的东西的任务,不知道如何使它工作,希望有人可以帮助:P
我有三个实体:“*person”、"paper“和”*property“。
Person ID是'persCod',papers ID是'serialNumber',并且properties具有'persCod'和'serialNumber'作为ID(复合主键)。
这个想法是一个人(persCod)可以有多个属性,每个属性都是一张给定的纸。
当发送一个GET请求来查找某个属性时,我希望响应主体包含该属性的所有信息+serialNumber等于找到的属性的'paper'的名称。我需要通过它的'persCod' tho搜索属性。

@Data
@Entity
@Table(name = "PERSON")
@NoArgsConstructor
@AllArgsConstructor
public class Person{
  @Id
  private Long persCod;
  private String name;
}

字符串

纸张

@Data
@Entity
@Table(name = "PAPERS")
@NoArgsConstructor
@AllArgsConstructor
public class Paper{
  @Id
  private Integer serialNumber;
  private String paperName;
}

房产

@Data
@Entity
@Table(name = "PROPERTY")
@IdClass(IdProperty.class)
@NoArgsConstructor
@AllArgsConstructor
public class Property {
  @Id
  private Long persCod;
  @Id
  private Integer serialNumber;
  private String paperName;
  private String description;

}

我需要的是,当向localhost:8080/property/{persCodA}发送GET请求时,得到这样的响应:

{
serialNumber: 101010,
paperName: "[the name of the paper which serialNumber also is 101010]",
description: the given description
},
{
serialNumber: 030303,
paperName: "[the name of the paper which serialNumber also is 030303]",
description: the given description
}


不知道我是否解释得足够好,但很高兴得到一些指导=]

sqougxex

sqougxex1#

  • 首先,通过主键persCod查询属于该人员的所有属性。
  • 然后,基于这组属性,循环通过每个属性的字段serialNumber查询关联纸张的paperName。
  • 第三,合并组合查询结果并返回它们。
  • 选择一:
-- Use join query
SELECT pro.serialNumber, pap.paperName, pro.description
FROM propertie pro
    LEFT JOIN pape pap
    ON pro.serialNumber = pap.serialNumber
WHERE pro.persCod = #{persCod};

字符串

  • 选择二:
public List<PropertyDTO> listByPersCode(String persCode) {
    // 1. query property table
    List<PropertyDO> propertyDOs = propertyDAO.selectByPersCode(persCode);

    // 2. query paper table
    List<String> serialNumbers = propertyDOs.stream()
            .map(PropertyDO::getSerialNumber)
            .collect(Collectors.toList());
    List<PaperDO> PaperDOs = paperDAO.selectBatchBySerialNumber(serialNumbers);

    // 3. combine the results
    Map<String, String> map = PaperDOs.stream()
            .collect(Collectors.toMap(PaperDO::getSerialNumber, PaperDO::getPaperName));

    return propertyDOs.stream()
            .map(propertyConverter::toDTO)  // copy object's fields
            .peek(e -> e.setPaperName(map.get(e.getSerialNumber())))
            .collect(Collectors.toList());
}

相关问题