0

我有一个关于在我的实体中处理计算字段(即计数)的最佳方法的问题。我有一个包含评论的建立实体,我不想加载评论,直到我必须加载,但我确实想在加载实体对象时获取评论的数量(计数)。处理这个问题的最佳方法是什么?我已经尝试创建一个 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可能是可以接受的。我的第一个想法是将所有休眠操作移动到 DAO 层并确保在检索对象时加载数据,但它可能很重

或者,我会使用FetchType.EAGER.

如果还是不适合你,就用HQL来做吧(抱歉有错误,我比较习惯JPQL)

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

并且在检索值集时,每个对象都会检索其总数。

于 2012-12-15T23:06:56.400 回答