【发布时间】:2018-12-27 21:07:52
【问题描述】:
我有以下模型:订单有多个项目,项目有多个其他子项。这是一棵有好几层深的树。
我在所有 @OneToMany 和 @JoinFetch 上都加载了 EAGER,在所有 @ManyToOne 上加载了 LAZY(以避免在 N+1 问题中的额外查询)。
根据How do I do a "deep" fetch join in JPQL?,我可以使用多个查询提示来预先加载整个树,但是,我更喜欢仅通过注释来执行此操作。
不幸的是,即使使用@JoinFetch 注释的整个树,似乎也只执行了 1 级深度的连接,导致对整个树进行多个查询而不是单个查询。
这些是我可以看到正在执行的查询:
Order - 所有子节点的左外连接。
OrderItem - 所有子级的左外连接。
...等所有级别。
我可以看到@JoinFetch 正在工作,但它只工作一层深。我想要实现的是加载整个树的单个查询。
虽然这一级深度加载确实帮助我将调用速度提高了 2 倍以上,但它们在一次加载大量实体时仍然不是最优的,因为每个实体意味着 5 个以上的额外查询。
有没有办法只加载带有注释的整个树,或者我应该手动设置多个查询提示来实现这一点?
James Sutherland here 的回答似乎不正确(关于递归工作)。
【问题讨论】:
-
你试过
@EntityGraph吗?这是join fetch的替代方法,用于急切加载关联。
标签: java jpa eclipselink