Saltar al contenido

Cómo mapear propiedades calculadas con JPA e Hibernate

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;

Reseñas y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *