如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行

Posted

技术标签:

【中文标题】如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行【英文标题】:How to map a nested JSON Object as an SQL table row in Spring Boot 【发布时间】: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 新手!

【问题讨论】:

【参考方案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 进行映射。

以上是关于如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring mvc中将嵌套列表元素传递给控制器

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

如何在 Spring Boot 中将属性文件值读入字符串集

如何在spring boot gradle项目中将时间戳附加到jar?

如何在spring boot中将@Value属性从application.properties注入@InjectMocks?

如何在弹性beantalk中将PostgreSQL RDS连接到spring boot?