Obliczona właściwość z JPA / Hibernate

Moja Java bean ma własność childCount. Ta właściwość jest nie mapowana do kolumny bazy danych . Zamiast tego powinien być obliczany przez bazę danych z COUNT() funkcją działającą na join of my Java bean i jego dzieci. Byłoby jeszcze lepiej, gdyby ta właściwość mogła być obliczona na żądanie / "leniwie", ale nie jest to obowiązkowe.

W najgorszym przypadku mogę ustawić właściwość tej fasoli za pomocą HQL lub Criteria API, ale wolałbym nie.

The Hibernate @Formula adnotacja może pomóc, ale ledwo znalazłem dokumentację.

Każda pomoc bardzo mile widziana. Dzięki.
Author: Vlad Mihalcea, 2010-06-07

2 answers

JPA nie oferuje żadnego wsparcia dla pochodnych nieruchomości, więc będziesz musiał użyć konkretnego rozszerzenia dostawcy. Jak już wspomnieliście, @Formula jest do tego idealna podczas korzystania z Hibernate. Możesz użyć fragmentu SQL:

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

Lub nawet złożone zapytania w innych tabelach:

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

Gdzie id jest id aktualnej jednostki.

Warto przeczytać następujący wpis na blogu: właściwości pochodne Hibernate-wydajność i przenośność.

Bez więcej szczegółów, nie mogę podaj dokładniejszą odpowiedź, ale powyższy link powinien być pomocny.

Zobacz też:

 136
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 16:43:20

Jak wyjaśniono w w tym artykule , masz trzy opcje:

  • albo obliczasz atrybut używając metody @Transient
  • Możesz również użyć @PostLoad entity listener
  • lub możesz użyć adnotacji specyficznej dla Hibernate @Formula

Podczas gdy Hibernate pozwala na użycie @Formula , z JPA, możesz użyć wywołania zwrotnego @PostLoad , aby wypełnić właściwość transient z wynikiem pewnego obliczenie:

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

Dla bardziej złożonych zapytań, możesz użyć Hibernate @Formula, Jak wyjaśniono w Ten artykuł :

@Formula(
    "round(" +
    "   (interestRate::numeric / 100) * " +
    "   cents * " +
    "   date_part('month', age(now(), createdOn)" +
    ") " +
    "/ 12) " +
    "/ 100::numeric")
private double interestDollars;
 32
Author: Vlad Mihalcea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 07:14:25