如何在 Spring Boot 中加入 SQL 表?

Posted

技术标签:

【中文标题】如何在 Spring Boot 中加入 SQL 表?【英文标题】:How to join SQL tables in Spring Boot? 【发布时间】:2021-09-01 21:35:04 【问题描述】:

如何将 Author 类中的 author_firstName 和 author_lastName 与 Book 类绑定?我使用 h2 数据库,author_id 和 book_id 是主键,我使用邮递员

public class Book 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private int id;
    @Column(name = "book_title")
    private String title;
    @Column(name = "book_genre")
    private String genre;
    @Column(name = "author")
    private String author;


@Entity
@Table(name="Author")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Author 
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="author_id")
    private int authorId;
    
    @Column(name="author_firstName")
    private String firstName;
    
    @Column(name="author_lastName")
    private String lastName;
    @Column(name="author_birth")
    private Date birth;


【问题讨论】:

我建议阅读有关 JPA 的教程,例如this one over at Baeldung 或 official JavaEE documentation。 所以我需要使用ManyToOne关系? 通常书籍可以有多个作者,任何作者都可以有多个书籍。所以它的many-to-many。但是你可以根据你的应用说它的one-to-many 是的,你是对的,所以我将使用多对多,但我有 Set,它不能在 Postman 中用 JSON 表示? 它是一个集合,您可以将它表示为 JSON 中的对象列表。像这样[ "authorId": 1, "authorId": 2 ] 【参考方案1】:

如果对author 使用字符串参数,您应该将其转换为@ManyToOne 关系:

@Entity
@Table(name="Author")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Author 
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="author_id")
    private int authorId;
    
    @Column(name="author_firstName")
    private String firstName;
    
    @Column(name="author_lastName")
    private String lastName;
    @Column(name="author_birth")
    private Date birth;

    @OneToMany(mappedBy = "author")
    private List<Book> books;


@Entity
public class Book 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private int id;
    @Column(name = "book_title")
    private String title;
    @Column(name = "book_genre")
    private String genre;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;


使用此模型,您将能够从任何入口点、作者的书籍(特定作者所写的书籍)或拥有书籍的作者(作者所写书籍的集合)中获取数据。

您可以使用findAll Spring Data JPA 实现的默认实现(如果您使用 EAGER 提取类型,将自动连接两个表),或者构建您自己的 JPQL:

FROM Author a FETCH JOIN a.books b WHERE a.id = b.author.

这将有助于您的代码的易读性并改进您的数据库数据规范化。

【讨论】:

以上是关于如何在 Spring Boot 中加入 SQL 表?的主要内容,如果未能解决你的问题,请参考以下文章

在spring-boot中加入两个实体

如何在 Spring JPA 存储库中加入多个表的结果

如何在 R2DBC 和 Spring WebFlux 中加入多个表?

在 spring jparepository 中加入多个表

如何通过Spring Boot在MongoDB中加载初始数据?

Spring Boot 项目如何做性能监控?