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

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

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

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

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

顺序-所有子级都左外连接。

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

...适用于所有级别。

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

尽管这一级别的深度加载确实帮助我将调用速度提高了2倍以上,但在一次加载很多实体时它们仍然不是最佳选择,因为每个实体意味着5个以上的附加查询。

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

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

最佳答案

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

关于java - 如何在EclipseLink中级联@JoinFetch?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51427542/

10-11 22:26