Frage

Meine Java Bean hat ein Kinderbetriebseigentum. Diese Eigenschaft ist Nicht auf eine Datenbankspalte zugeordnet. Stattdessen sollte es sein berechnet durch die Datenbank mit a COUNT() Funktion operiert auf der Verbindung meiner Java -Bohne und seiner Kinder. Es wäre sogar noch besser, wenn diese Eigenschaft bei Bedarf / "faul" berechnet werden könnte, aber dies ist nicht obligatorisch.

Im schlimmsten Fall kann ich das Eigentum dieser Bean mit HQL oder der Kriterien -API einstellen, aber ich würde es vorziehen, dies nicht zu tun.

Der Winterschlaf @Formula Annotation kann helfen, aber ich konnte kaum eine Dokumentation finden.

Jede Hilfe war sehr geschätzt. Vielen Dank.

War es hilfreich?

Lösung

JPA bietet keine Unterstützung für abgeleitete Immobilien, sodass Sie eine providerspezifische Erweiterung verwenden müssen. Wie du erwähnt hast, @Formula ist perfekt dafür bei der Verwendung von Hibernate. Sie können ein SQL -Fragment verwenden:

@Formula("PRICE*1.155")
private float finalPrice;

Oder sogar komplexe Abfragen an anderen Tischen:

@Formula("(select min(o.creation_date) from Orders o where o.customer_id = id)")
private Date firstOrderDate;

Wo id ist der id der aktuellen Entität.

Der folgende Blog -Beitrag ist das Lesen wert: Hibernate abgeleitete Eigenschaften - Leistung und Portabilität.

Ohne weitere Details kann ich keine genauere Antwort geben, aber der obige Link sollte hilfreich sein.

Siehe auch:

Andere Tipps

Wie erklärt Dieser Artikel, Sie haben drei Optionen:

  • Entweder berechnen Sie das Attribut mit a @Transient Methode
  • Sie können auch verwenden @PostLoad Entitätshörer
  • Oder Sie können den Winterschlafspezifikum verwenden @Formula Anmerkung

Während Hibernate es Ihnen ermöglicht, zu verwenden @Formel, Mit JPA können Sie die verwenden @Postload Rückruf, um a zu bevölkern vorübergehend Eigenschaft mit dem Ergebnis einer Berechnung:

@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;
}

Für komplexere Fragen können Sie den Winterschlaf verwenden @Formula, wie in Dieser Artikel:

@Formula(
    "round(" +
    "   (interestRate::numeric / 100) * " +
    "   cents * " +
    "   date_part('month', age(now(), createdOn)" +
    ") " +
    "/ 12) " +
    "/ 100::numeric")
private double interestDollars;

Sich ansehen Blaze-Persistenz-Entität Ansichten Das funktioniert über JPA und bietet erstklassige DTO -Unterstützung. Sie können alles an Attribute innerhalb von Entity -Ansichten projizieren, und es wird sogar vorhandene Join -Knoten für Assoziationen wiederverwendet.

Hier ist ein Beispiel -Mapping

@EntityView(Order.class)
interface OrderSummary {
  Integer getId();
  @Mapping("SUM(orderPositions.price * orderPositions.amount * orderPositions.tax)")
  BigDecimal getOrderAmount();
  @Mapping("COUNT(orderPositions)")
  Long getItemCount();
}

Wenn Sie dies abrufen

SELECT
  o.id,
  SUM(p.price * p.amount * p.tax),
  COUNT(p.id)
FROM
  Order o
LEFT JOIN
  o.orderPositions p
GROUP BY
  o.id

Hier ist ein Blog -Beitrag über benutzerdefinierte Unterabbildungsanbieter, die auch für Sie interessant sein könnten: https://blaBit.com/blog/2017/entity-view-mapping-subqueries.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top