Esta es la respuesta más válida que te podemos dar, pero primero obsérvala pausadamente y analiza si es compatible a tu proyecto.
Solución:
JPA no ofrece ningún soporte para propiedades derivadas, por lo que deberá usar una extensión específica del proveedor. Como lo mencionaste, @Formula
es perfecto para esto cuando se usa Hibernate. Puedes usar un fragmento de SQL:
@Formula("PRICE*1.155")
private float finalPrice;
O incluso consultas complejas en otras tablas:
@Formula("(select min(o.creation_date) from Orders o where o.customer_id = id)")
private Date firstOrderDate;
Donde id
es el id
de la entidad actual.
Vale la pena leer la siguiente publicación de blog: Propiedades derivadas de Hibernate: rendimiento y portabilidad.
Sin más detalles, no puedo dar una respuesta más precisa, pero el enlace anterior debería ser útil.
Ver también:
- Sección 5.1.22. Elementos de columna y fórmula (documentación de Hibernate Core)
- Sección 2.4.3.1. Fórmula (documentación de anotaciones de Hibernate)
Tienes tres opciones:
- o estás calculando el attribute usando un
@Transient
método - también puedes usar
@PostLoad
oyente de entidad - o puede usar el Hibernate específico
@Formula
anotación
Si bien Hibernate le permite usar @Formula, con JPA, puede usar la devolución de llamada @PostLoad para completar un transitorio propiedad con el resultado de algún cálculo:
@Column(name = "price")
private Double price;
@Column(name = "tax_percentage")
private Double taxes;
@Transient
private Double priceWithTaxes;
@PostLoad
private void onLoad()
this.priceWithTaxes = price * taxes;
Entonces, puedes usar Hibernate @Formula
Me gusta esto:
@Formula("""
round(
(interestRate::numeric / 100) *
cents *
date_part('month', age(now(), createdOn)
)
/ 12)
/ 100::numeric
""")
private double interestDollars;