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.yml
或 application.properties
.
即可启用休眠验证
现在在 spring 启动时你会得到这个异常(如果你有 address/adress 的拼写错误):
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: Address.user, referenced property unknown: User.adress
您还可以使用其他模式。看看 documentation.
所有模式(预期 none
)都将验证模式。
这是最好的解决方案,因为没有编译时检查。
您也可以尝试使用 JOOQ。
有没有办法在 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.yml
或 application.properties
.
现在在 spring 启动时你会得到这个异常(如果你有 address/adress 的拼写错误):
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: Address.user, referenced property unknown: User.adress
您还可以使用其他模式。看看 documentation.
所有模式(预期 none
)都将验证模式。
这是最好的解决方案,因为没有编译时检查。
您也可以尝试使用 JOOQ。