【问题标题】:How to map a nested JSON Object as an SQL table row in Spring Boot如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行
【发布时间】:2020-07-19 07:40:19
【问题描述】:

我正在使用 Spring 和 JPA 一起开发 API。我正在处理一个 POST 请求,该请求接受 @RequestBody 作为 JSON 对象,看起来像这样-

{
  "id": "323",
  "name": "Sam",
  "gpsLocation": {
    "latitude": 66.7492558,
    "longitude": 97.133258
  }
}

还有一个包含以下列的 SQL User 表-

id | name | latitude | longitude

在 Spring 中有没有办法将这个嵌套的 json 对象直接映射到这些表列?

这就是我的User.javaGpsLocation.java 实体类现在的样子-

@Table(name = "user")
@Entity
public class UnderObservation {

    @Column(name = "name", nullable = false)
    private String name;

    @Id
    @Column(name = "id", nullable = false)
    private String userID;

    private GpsLocation location;
}


@Entity
public class GpsLocation {

    @Column(name = "Latitude", nullable = false)
    private Double Latitude;

    @Column(name = "Longitude", nullable = false)
    private Double Longitude;

}

我正在寻找一种“展平/解包”GpsLocation 类的方法,以便它直接适合User 表,而不是为GpsLocation 提供单独的表。

我无法更改 JSON 结构,因为其他一些无 SQL 数据库正在使用它。另外,我是 Spring 新手!

【问题讨论】:

    标签: spring spring-boot jpa spring-data-jpa jackson


    【解决方案1】:

    这里的最佳做法是使用包含request bodyDTO 数据传输对象 并使用mapstructObjectMapper 等外部库将其映射到user 对象,甚至手动进行

    DTO 是一个 pojo 对象,在进程之间携带数据

    【讨论】:

      【解决方案2】:

      构造函数试试这个方法:

              @Getter
              @Setter
              @Table(name = "user")
              @Entity
              public class UnderObservation {
      
                  @Column(name = "name", nullable = false)
                  private String name;
      
                  @Id
                  @Column(name = "id", nullable = false)
                  private String userID;
      
                  @Column(name = "latitude", nullable = false)
                  private Double latitude;
      
                  @Column(name = "longitude", nullable = false)
                  private Double longitude;
      
                  private GpsLocation location;
      
      
                  UnderObservation(String name, String userID, GpsLocation location) {
                      this.name = name;
                      this.userID = userID;
                      this.location = location;
      
                      this.latitude = this.location.getLatitude();
                      this.longitude = this.location.getLongitude();
                  }
      
      
      
      
              }
      

      【讨论】:

      • 在 spring 中不起作用,因为它使用 noArgs 构造函数和 setter 进行映射。
      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 2021-07-06
      • 2019-08-03
      • 2019-11-24
      • 2021-03-29
      • 2021-05-27
      • 2016-05-19
      • 1970-01-01
      相关资源
      最近更新 更多