gpt4 book ai didi

jpa - 如何在 JPQL 中进行 "deep"提取连接?

转载 作者:行者123 更新时间:2023-12-04 00:58:41 25 4
gpt4 key购买 nike

我认为我永远不会完全理解 fetch joins。

我有一个查询,我正试图急切地将引用“膨胀”到两个级别。

也就是我的A有一个可选的 CollectionB s,每个 B有 0 或 1 C . B 的大小已知集合很小(10-20 个顶部)。我想预取这张图。
AB关系标记为 FetchType.LAZY并且是可选的。 BC 的关系也是可选的,FetchType.LAZY .

我希望我能做到:

SELECT a 
FROM A a
LEFT JOIN FETCH a.bs // look, no alias; JPQL forbids it
LEFT JOIN a.bs b // "repeated" join necessary since you can't alias fetch joins
LEFT JOIN FETCH b.c // this doesn't seem to do anything
WHERE a.id = :id

当我运行它时,我看到 A小号 B确实提取了集合(我在 SQL 中看到 LEFT JOIN 引用了 B 映射到的表)。

但是,我没有看到这样的证据表明 C的表被取出。

如何预取所有 C s 和所有 B s 和所有 C从给定的 A 中“可达”的 s ?我看不出有任何方法可以做到这一点。

最佳答案

JPA 规范不允许为 fetch join 设置别名,但一些 JPA 提供程序允许。

EclipseLink 从 2.4 开始。 EclipseLink 还允许使用点表示法(即“JOIN FETCH a.bs.c”)进行嵌套连接提取,并支持允许嵌套连接的查询提示“eclipselink.join-fetch”(您可以指定多个相同提示名称的提示)。

通常,在 fetch 连接上使用别名时需要小心,因为您可能会影响返回的数据。

看,
http://java-persistence-performance.blogspot.com/2012/04/objects-vs-data-and-filtering-join.html

关于jpa - 如何在 JPQL 中进行 "deep"提取连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com