使用 JPA 计算延迟加载属性的最佳位置在哪里

Ke.*_*Ke. 2 java orm hibernate jpa

假设我们有一个“问题”和“答案”实体,

@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>();
......
Run Code Online (Sandbox Code Playgroud)

每次查询问题时,我都需要告诉该问题有多少个答案。所以我需要计算:

String count = "select count(o) from Answer o WHERE o.question=:q";
Run Code Online (Sandbox Code Playgroud)

我的问题是,哪里是进行计数的最佳位置?(因为我对Question实体做了很多查询,按日期、按标签、按类别、按询问者等。在每个查询中添加计数操作显然不是一个好的解决方案。

我的第一次尝试是实现一个 @PostLoad 侦听器,因此每次加载 Question 实体时,我都会进行计数。但是,EntityManager 无法注入侦听器中。所以这个方法行不通。

有什么提示吗?(我使用 Hibernate 作为提供程序)。

Pas*_*ent 5

如果不排除使用扩展,您可以使用@LazyCollection以下EXTRA选项:

@OneToMany(fetch = FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
private List<Answer> answers = new ArrayList<Answer>();
Run Code Online (Sandbox Code Playgroud)

这将允许answers.size()在不加载集合的情况下进行调用。