【发布时间】:2016-08-04 08:01:20
【问题描述】:
我们有一些实体,它们有一堆用 Hibernate 的 @Formula 注释注释的属性。注解中的 SQL sn-ps 主要运行标量子查询(例如COUNT 查询)。例如,我们有一个深度为四级的一对多关系层次结构:A <- B <- C <- D(其中<- 表示一对多关联)。通常在获取A 类型的实体时,我们想知道D 类型的关联实体的数量。为此,我们在A 中使用@Formula-annotated 属性。
由于我们并非每次都需要这些值,因此我们将 @Formula 属性声明为延迟加载(我们启用了 Hibernate 的字节码增强功能以实现这一点)。但是对于某些查询,我们希望急切地加载这些属性。我们经常在一个查询中加载数百个A 类型的实体,动态控制这些属性的急切/延迟加载在性能方面很重要。我们已经使用 JPA 的实体图来控制为某些查询急切加载哪些属性,但实体图似乎在这里不起作用。即使我们在实体图中列出了@Formula 属性,它们仍然是延迟加载的。
是否可以在每个查询的基础上动态控制 @Formula 列的延迟/急切加载?我们目前仅限于 JPA Criteria Query API,并且无法使用命名查询在这里。
更新:
所讨论的属性不是与其他实体的关联,而只是一些计算值。这意味着例如fetch profile 在这里不适用,因为它们只适用于实体关联(或者至少我是这样理解Hibernate manual)。以下是我们的 @Formula 属性之一的示例:
@Entity
public class A {
@Basic(fetch = FetchType.LAZY)
@Formula("(select count(*) from entity_D_table where ...)")
private int associatedDCount;
...
}
【问题讨论】: