我有 3 个实体 A、B 和 C。
- A 包含一个一对一链接的 B 实体
- A 包含 C 实体的一对多链接列表
- B 包含 C 实体的一对多链接列表
数据库方面有 5 个表。对应实体的 3 个表和 2 个单独的链接表,一个包含 A 和 C 之间的链接 (A_to_C),另一个包含 B 和 C 之间的链接 (B_to_C)。在我的存储库中,我试图从特定的 A 记录中检索所有 C 实体,这意味着来自 A 本身的 C 实体和通过 B 链接的 C 实体。
在传统的 SQL 中,这可以使用类似的方法来完成:
select C.*
from A
left join A_to_C on A_to_C.A_ID = A.ID
left join B_to_C on B_to_C.B_ID = A.B_ID
inner join C on C.ID = A_to_C.C_ID OR C.ID = B_to_C.C_ID
where A.ID = '1';
或(从 C 开始)
select C.*
from C
left join A_to_C on A_to_C.C_ID = C.ID
left join B_to_C on B_to_C.C_ID = C.ID
inner join A on A.B_ID = B_to_C.B_ID OR
A.ID = A_to_C.A_ID
where A.ID = '1';
在这些 SQL 示例中,没有指向 B 表的链接,因为 A 包含 B 的 ID,而且它也是 B_to_C 中使用的 ID,所以我真的不需要它。我也知道这些并不完全相同,但是当我只对 C 感兴趣时,它们会产生相同的结果。
不过,我真的在为如何在 CriteriaBuilder (最好)或 JPQL 中做到这一点而苦苦挣扎。我对 jpa 还是比较陌生,所以我希望这里有人可以帮助我。