0

エンティティで計算フィールド、つまりカウントを処理するための最良の方法について質問があります。レビューを含むEstablishmentエンティティがあり、必要になるまでレビューをロードしたくありませんが、エンティティオブジェクトをロードするときにレビューの数(カウント)を取得したいと思います。これを処理するための最良の方法は何ですか?numReviewsフィールドを作成し、@ Transientに注釈を付けようとしましたが、getReviews()。size()を呼び出したときにセッションが閉じられるという問題が発生しています。これが正しいアプローチであるかどうか、または従うべきより良いパターンがあるかどうかを知りたいですか?

@Entity
@Table(name="ESTABLISHMENT")
public class Establishment {
...
private Set<Review> reviews = new HashSet<Review>();
...
//Make this extra lazy so we can do a count without loading all the things
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "establishment")
    @LazyCollection(LazyCollectionOption.EXTRA)
    public Set<Review> getReviews() {
        return reviews;
    }
    public void setReviews(Set<Review> reviews) {
        this.reviews = reviews;
    }

    @Transient
    public int getNumReviews(){
        if(this.numReviews == null){
            numReviews = this.getReviews().size();
        }
        return numReviews;
    }
4

1 に答える 1

0

Correct意見があるかもしれません。私の最初のアイデアは、すべてのHibernate操作をDAOレイヤーに移動し、オブジェクトを取得するときにデータがロードされるようにすることですが、重い場合があります

または、を使用しますFetchType.EAGER

それでも問題が解決しない場合は、HQLを使用してください(間違いがあります。JPQLに慣れています)

SELECT est, COUNT(rev) FROM Establishment est inner join est.reviews rev ....

そして、値セットを取得するときに、各オブジェクトはその合計を取得しました。

于 2012-12-15T23:06:56.400 に答える