123

私のJavaBeanにはchildCountプロパティがあります。このプロパティはデータベース列にマップされていません。代わりに、 JavaBeanとその子の結合で動作する関数を使用してデータベースで計算するCOUNT()必要があります。このプロパティをオンデマンド/「遅延」で計算できればさらに良いでしょうが、これは必須ではありません。

最悪のシナリオでは、HQLまたはCriteria APIを使用してこのBeanのプロパティを設定できますが、設定したくありません。

Hibernate@Formulaアノテーションが役立つ場合がありますが、ドキュメントはほとんど見つかりませんでした。

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

190

JPA は派生プロパティをサポートしていないため、プロバイダー固有の拡張機能を使用する必要があります。おっしゃったように、 @FormulaHibernate を使用する場合はこれに最適です。SQL フラグメントを使用できます。

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

または、他のテーブルに対する複雑なクエリも:

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

idid現在のエンティティの です。

次のブログ投稿は読む価値があります: Hibernate Derived Properties - Performance and Portability

詳細がなければ、より正確な回答はできませんが、上記のリンクが役立つはずです。

以下も参照してください。

于 2010-06-06T23:30:00.847 に答える
65

次の 3 つのオプションがあります。

  • @Transientメソッドを使用して属性を計算している
  • @PostLoadエンティティリスナーも使用できます
  • @Formulaまたは、Hibernate 固有のアノテーションを使用できます

Hibernate では@Formulaを使用できますが、JPA では@PostLoadコールバックを使用して、一時的なプロパティに計算結果を入力できます。

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

@Formulaしたがって、次のように Hibernate を使用できます。

@Formula("""
    round(
       (interestRate::numeric / 100) *
       cents *
       date_part('month', age(now(), createdOn)
    )
    / 12)
    / 100::numeric
    """)
private double interestDollars;
于 2015-03-12T07:45:33.057 に答える