Spring Data JPA - 如何在检索后设置临时字段
Spring Data JPA - how to set transient fields after retrieval
使用 Spring Data JPA 的 JpaRepository
方法获取实体后,例如findOne
、findBy...
等,我想知道自动执行一些自定义代码的最佳方法是什么,比如初始化一些瞬态字段。
换句话说,假设我有一个带有 fullName
瞬态字段的用户实体,从数据库中获取后应将其设置为 firstName
和 lastName
的串联,我该怎么办?
您可以使用 @Access(AccessType.Property)
来理想地设置瞬变场。
您通常必须在 setter 方法中提及 @Access(AccessType.Property)
,然后您可以在该 setter 方法中设置该瞬态字段的值。
或者在存储库的情况下,你可以很好地编写一个 JPQL
这样的东西。
@Query("SELECT new Hello(a.x*a.y,a.x,a.y)FROM Hello a WHERE t.value = :value")
然后在构造函数中将此 transient variable
的值设置为 a.x*a.y
首先,如果你想要全名,只需编写一个动态连接 forename/surname 的方法。它不一定是一个字段。
如果您确实需要对实体加载进行一些处理,请注册一个 @PostLoad
实体生命周期回调:
public class MyEntity{
@PostLoad
//invoked by framework on entity load.
public void doStuff(){
fullName = forename + " " + surname;
}
//alternative
public String getFullName(){
return forename + " " + surname;
}
https://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Example_of_Entity_event_annotations
我自己还没有尝试过,但 @PostLoad 注释似乎可以帮助您在从数据库中检索业务对象后执行代码来更改它的状态。
但在您的具体情况下,我会简单地创建一个连接 firstName 和 secondName 的方法 getFullName,而不将值存储在 bean 中。
使用 Spring Data JPA 的 JpaRepository
方法获取实体后,例如findOne
、findBy...
等,我想知道自动执行一些自定义代码的最佳方法是什么,比如初始化一些瞬态字段。
换句话说,假设我有一个带有 fullName
瞬态字段的用户实体,从数据库中获取后应将其设置为 firstName
和 lastName
的串联,我该怎么办?
您可以使用 @Access(AccessType.Property)
来理想地设置瞬变场。
您通常必须在 setter 方法中提及 @Access(AccessType.Property)
,然后您可以在该 setter 方法中设置该瞬态字段的值。
或者在存储库的情况下,你可以很好地编写一个 JPQL
这样的东西。
@Query("SELECT new Hello(a.x*a.y,a.x,a.y)FROM Hello a WHERE t.value = :value")
然后在构造函数中将此 transient variable
的值设置为 a.x*a.y
首先,如果你想要全名,只需编写一个动态连接 forename/surname 的方法。它不一定是一个字段。
如果您确实需要对实体加载进行一些处理,请注册一个 @PostLoad
实体生命周期回调:
public class MyEntity{
@PostLoad
//invoked by framework on entity load.
public void doStuff(){
fullName = forename + " " + surname;
}
//alternative
public String getFullName(){
return forename + " " + surname;
}
https://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Example_of_Entity_event_annotations
我自己还没有尝试过,但 @PostLoad 注释似乎可以帮助您在从数据库中检索业务对象后执行代码来更改它的状态。
但在您的具体情况下,我会简单地创建一个连接 firstName 和 secondName 的方法 getFullName,而不将值存储在 bean 中。