假设我们有一个“问题”和“答案”实体,
@Entity
public class Question extends IdEntity {
@Lob
private String content;
@Transient
private int answerTotal;
@OneToMany(fetch = FetchType.LAZY)
private List<Answer> answers = new ArrayList<Answer>();
......
我每次询问问题时都需要告诉问题答案的数量。所以我需要做点数:
String count = "select count(o) from Answer o WHERE o.question=:q";
我的问题是,计算的最佳位置在哪里? (因为我做了很多关于Question实体的查询,按日期,按标签,按类别,按提问者等等。在每个查询中添加计数操作显然不是一个好的解决方案。
我的第一次尝试是实现一个@PostLoad监听器,所以每次加载Question实体时,我都会计算。但是,EntityManager无法在侦听器中注入。所以这种方式不起作用。
任何提示? (我使用Hibernate作为提供者)。
答案 0 :(得分:3)
如果不排除使用扩展程序,您可以使用EXTRA
选项使用@LazyCollection
:
@OneToMany(fetch = FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
private List<Answer> answers = new ArrayList<Answer>();
这样可以在不加载集合的情况下调用answers.size()
。