Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Data JPA - how to set transient fields after retrieval

After an entity is fetched using the JpaRepository methods of Spring Data JPA, e.g. findOne, findBy..., etc., I was wondering what would be the best way to automatically execute some custom code, say to initialize some transient fields.

In other words, suppose I have a User entity with a fullName transient field, which should be set as a concatenation of firstName and lastName after fetching from the database, what should I do?

like image 725
Sanjay Avatar asked Aug 30 '25 18:08

Sanjay


2 Answers

Firstly, if all you want if full name just write a method that concatenates forename/surname on the fly. It doesn't have to be a field.

If you really need to do some processing on Entity load then register a @PostLoad entity lifecycle callback:

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

like image 56
Alan Hay Avatar answered Sep 03 '25 04:09

Alan Hay


You can use @Access(AccessType.Property) for setting transient fields ideally.

You have to mention @Access(AccessType.Property) on the setter method normally and then you can set value of that transient field in that setter method.

Alternatively in case of repositories , you can very well write a JPQL something like this.

@Query("SELECT new Hello(a.x*a.y,a.x,a.y)FROM Hello a WHERE t.value = :value")

and then in the constructor set the value of this transient variable with a.x*a.y

like image 44
shankarsh15 Avatar answered Sep 03 '25 04:09

shankarsh15