5

次のように、休止状態を使用して、HQL を使用して多数のエンティティの合計を取得できることがわかりました...

public Long getEnvelopeTotal(AbstractEnvelope envelope) {
    String query = "select sum(t.amount) from User_Transaction t";
    Long result = (Long) hibernateUtil.getSession().createQuery(query).uniqueResult();
    return result;
}

現在、アプリケーションの残りの部分は、オブジェクト グラフのみを介してデータベースをシームレスにナビゲートできます。上記の関数を使用しなければならない問題は、次の疑似コードを実行する必要があることです...

  1. エンティティ「封筒」のインスタンスを取得
  2. Envelope インスタンス i を渡す
  3. getEnvelopeTotal の結果に基づいて、Envelope インスタンス プロパティ「total」を結果に設定します。

プロパティ「合計」が単純なデータベース列にマップされるのではなく、カスタム HQL クエリを介して設定されるような方法で hibernate を使用できるかどうか疑問に思っています。

元:

@SomeMagicAnnotation(query="select sum(t.amount) from User_Transaction t")
private Long total;

助言がありますか?

4

2 に答える 2

13

ああ、このブログ投稿を読んだ後、私はそれを理解しました。

コードは次のようになります。

@Entity(name = "Abstract_Envelope")
public abstract class AbstractEnvelope extends AbstractAccount {

    @OneToMany(mappedBy = "abstractEnvelope")
    private List<UserTransaction> userTransactions;
    @Formula(value = "select sum(t.amount) from User_Transaction t where t.abstractenvelope_id = id")
    private Long total;

    public List<UserTransaction> getUserTransactions() {
        return userTransactions;
    }

    public void setUserTransactions(List<UserTransaction> userTransactions) {
        this.userTransactions = userTransactions;
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }
}

メソッドの代わりにフィールドに注釈を付ける必要があることに注意してください(そうしなければなりませんでした)。これらのクエリを作成するときは、Bean プロパティ名ではなく実際の DB 列名を参照しています。また、something.id の代わりに id を参照することで、効果的に this.id または this.price を参照しています。

于 2009-07-09T00:19:12.773 に答える
2

私はあなたが数式注釈を探していると思います: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e2273

于 2009-07-08T04:57:41.767 に答える