Hibernate-Tipps: Entitätseigenschaften mit der @Formula-Annotation berechnen

Die Hibernate-Tipps-Serie bietet schnelle und einfache Lösungen zu verbreiteten Hibernate-Fragen. Dieses Mal geht es um die Abbildung des Rückgabewerts einer SQL-Funktion auf das Attribut einer Entität.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Thorben Janssen
Inhaltsverzeichnis

Die Hibernate-Tipps-Serie bietet schnelle und einfache Lösungen zu verbreiteten Hibernate-Fragen. Dieses Mal geht es um die Abbildung des Rückgabewerts einer SQL-Funktion auf das Attribut einer Entität.

Der Wert eines meiner Entity-Attribute wird durch eine SQL-Funktion berechnet. Wie kann ich das mit Hibernate abbilden?

Hibernates @Formula-Annotation ermöglicht es, ein SQL-Schnipsel bereitzustellen, den Hibernate ausführt, wenn es die Entität aus der Datenbank liest. Der Rückgabewert des SQL-Schnipsel wird dann auf ein schreibgeschütztes Entity-Attribut abgebildet. Dies kann vorteilhaft sein, wenn die Datenbank bereits eine komplexe Funktion bereitstellt, die auf einer großen Datenmenge arbeitet.

Das folgende, vereinfachte Beispiel verwendet die @Formula-Annotation, um das Alter eines Autors zu berechnen. Alternativ könnte dies in diesem Beispiel natürlich auch durch eine Java-Methode erfolgen:

@Entity
public class Author {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column
private LocalDate dateOfBirth;

@Formula(value = “date_part(‘year’, age(dateOfBirth))”)
private int age;



public int getAge() {
return age;
}
}

Wenn Hibernate eine Author-Entität aus der Datenbank holt, fügt es das durch die @Formular-Annotation definierte SQL-Schnipsel zur SQL-Anweisung hinzu:

05:35:15,762 DEBUG [org.hibernate.SQL] – select author0_.id as id1_0_, author0_.dateOfBirth as dateOfBi2_0_, author0_.firstName as firstNam3_0_, author0_.lastName as lastName4_0_, author0_.version as version5_0_, date_part(‘year’, age(author0_.dateOfBirth)) as formula0_ from Author author0_ where author0_.id=1

Die @Formula-Annotation bietet eine einfache Möglichkeit, das Ergebnis eines SQL-Schnipsel auf ein Entity-Attribut abzubilden. Aber es hat auch einige Nachteile, die man beachten sollten:

  • Hibernate führt das SQL-Schnipsel für jede Author-Entität aus, die sie aus der Datenbank geladen wird. Daher ist es wichtig, diese Annotation nur für Attribute zu verwenden, die in allen Anwendungsfällen benötigt werden.
  • Die @Formula-Annotation verwendet ein natives SQL-Schnipsel. Dies kann dies Datenbankportabilität der Anwendung beeinträchtigen.

Mehr als 70 solcher Rezepte zu Themen wie einfache und komplexe Mappingdefinitionen, Logging, Unterstützung von Java 8, Caching sowie die statische und dynamische Erzeugung von Abfragen gibt es in meinem Buch "Hibernate Tips: More than 70 solutions to common Hibernate problems". Es ist als Taschenbuch und E-Book auf Amazon und als PDF auf hibernate-tips.com erhältlich. ()