Spring Data JPA - 如何在检索后设置临时字段

Spring Data JPA - how to set transient fields after retrieval

使用 Spring Data JPA 的 JpaRepository 方法获取实体后,例如findOnefindBy... 等,我想知道自动执行一些自定义代码的最佳方法是什么,比如初始化一些瞬态字段。

换句话说,假设我有一个带有 fullName 瞬态字段的用户实体,从数据库中获取后应将其设置为 firstNamelastName 的串联,我该怎么办?

您可以使用 @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 中。