Java Spring 启动,以类型安全的方式连接表,无需纯字符串

Java Spring Boot, Join tables in type safe way without plain strings

有没有办法在 Spring Boot 中连接表而不使用类型不安全的纯 SQL 字符串?目前正在使用 JBDC .

这里的这些方法不是字符串安全的: Joining two table entities in Spring Data JPA

在 .NET 中,Entity Framework 在 C# 中有一个方法,

from u in db.Users
join ad in db.Address on u.Addressid equals ad.AddressId
select ..

Java 示例:

@Entity
@Table(name = "users")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    //... 

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    private Address address;

    // ... getters and setters
}

@Entity
@Table(name = "address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    //...

    @OneToOne(mappedBy = "address")
    private User user;

    //... getters and setters
}

它是“类型安全的”——因为它们都是字符串。

您的问题是:如果有人使用了“错误的”引用字段,那么它不会在编译时进行检查。
这是真实的,无法更改,但您可以在运行时检查它。
甚至更好:Spring/Hibernate 可以为您做到这一点。
只需将 spring.jpa.hibernate.ddl-auto=validate 添加到 application.ymlapplication.properties.

即可启用休眠验证

现在在 spring 启动时你会得到这个异常(如果你有 address/adress 的拼写错误):

Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: Address.user, referenced property unknown: User.adress

您还可以使用其他模式。看看 documentation.
所有模式(预期 none)都将验证模式。
这是最好的解决方案,因为没有编译时检查。

您也可以尝试使用 JOOQ