我有以下模型:订单有多个项目,而项目有多个其他子级。这是一棵深达几层的树。
我在所有@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的答案似乎并不正确(关于递归工作)。