我们有几个实体,其中有一些使用Hibernate的@Formula
批注注释的属性。注释中的SQL片段主要运行标量子查询(例如COUNT
查询)。举例来说,我们有一个四层深的一对多关系层次结构:A <- B <- C <- D
(其中<-
表示一对多关联)。在获取类型为A
的实体时,我们很想知道D
类型的关联实体的数量。为此,我们在A
中使用@Formula
-annated财产。因为我们并不需要每次都使用这些值,所以我们宣布@Formula
属性为延迟加载(我们启用了Hibernate的字节码增强功能以使其成为可能)。但对于某些查询,我们希望加载这些属性。我们经常在一个查询中加载数百个A
类型的实体,并且动态地控制这些属性的加载/延迟加载在性能方面非常重要。我们已经使用JPA的实体图来控制哪些属性被热切地加载某些查询,但实体图似乎不适用于此。即使我们在实体图中列出了@Formula
属性,它们仍然会延迟加载。动态地控制@Formula列的惰性加载/动态加载
是否可以根据每个查询基础动态地控制惰性/热切加载@Formula
列?我们目前仅限于JPA Criteria Query API,并且命名查询在这里不可能。
更新:
有问题的属性不是关联到其他实体,但只是一些计算值。这意味着例如获取配置文件在这里不适用,因为它们只适用于实体关联(或者至少这是我理解Hibernate manual的方式)。这是我们的@Formula
性能的一个示例:
@Entity
public class A {
@Basic(fetch = FetchType.LAZY)
@Formula("(select count(*) from entity_D_table where ...)")
private int associatedDCount;
...
}
但是不是只适用于实体关联的抓取配置文件?我添加了一个代码示例,说明我们的属性是什么样子的,我不认为抓取配置文件可以在这里工作。 –
你说得对。你能否考虑在你的数据库中定义一个SQL视图并在其上映射一个新的实体以便作为一个简单的属性热切地获取公式? –
我一直在考虑创建一个视图,但这需要在代码库中进行很多更改。目前我们使用JPA实体图来一次性加载来自十几个表的数据,代码期望它能够获得整个实体图。但如果目前的方法在基准测试中结果太慢,我们将不得不再次考虑这一点。 –