如何在EclipseLink中级联@JoinFetch?

时间:2018-07-19 16:18:53

标签: java jpa eclipselink

我有以下模型:订单有多个项目,而项目有多个其他子级。这是一棵深达几层的树。

我在所有@OneToMany上同时加载了EAGER,在所有@JoinFetch上同时加载了LAZY(以避免在N + 1问题中进行其他查询)。

根据How do I do a "deep" fetch join in JPQL?,我可以使用多个查询提示来大概加载整棵树,但是,我宁愿仅通过注释来执行此操作。

不幸的是,即使整个树都用@ManyToOne注释,似乎联接仅执行了1级深度,导致对整个树进行了多个查询,而不是单个查询。

这些是我可以看到正在执行的查询:

顺序-所有子级上的左外部联接。

OrderItem-所有子级上的左外部联接。

...适用于所有级别。

我可以看到@JoinFetch在起作用,但是它只能深入一层。我想要实现的是一个查询来加载整个树。

虽然这一级别的深度加载确实帮助我将调用速度提高了2倍以上,但在一次加载许多实体时仍然是次优的,因为每个实体都意味着5个以上的附加查询。

有没有一种方法可以只用注解加载整个树,还是应该手动设置多个查询提示来实现这一点?

James Sutherland here的答案似乎并不正确(关于递归工作)。

1 个答案:

答案 0 :(得分:0)

经过大量的实验,我得出的结论是,(设计?)的注释仅适用于1级深度。为了完全控制,我放弃了注释,而是使用查询提示。跟踪bug