我对在我的实体中处理计算字段(即计数)的最佳方法有疑问。我有一个包含评论的企业实体,我不想在必要之前加载评论,但我确实希望在加载实体对象时获得评论的数量(计数)。处理这个问题的最佳方法是什么?我已经尝试创建一个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;
}
答案 0 :(得分:0)
Correct
可能是可见的。我的第一个想法是将所有的hibernate操作移动到DAO层,并确保在检索对象时,数据已加载,但可能很重
或者,我会使用FetchType.EAGER
。
如果仍然不适合你,请使用HQL(抱歉是有一些错误,我更习惯JPQL)
SELECT est, COUNT(rev) FROM Establishment est inner join est.reviews rev ....
当检索值时,每个对象检索其总数。