gpt4 book ai didi

jpa - 如何过滤jpa查询中的左连接

转载 作者:行者123 更新时间:2023-12-05 06:43:57 31 4
gpt4 key购买 nike

我遇到了 JPA 对象未返回的问题。我有客户和地址,客户可以有零个或多个地址。我也软删除项目。此查询有效,除非没有返回地址,否则我不会返回客户详细信息(返回 null)。

所以我这样设置我的查询:

select c from Customer c
left join fetch c.createUser
left join fetch c.lastUpdateUser
left join fetch c.addressBook a
where c.id = 1 and c.markForDelete = false
and (a.id is null or a.markForDelete = false)

如果 addressBook 中有一行,它就可以正常工作。但是,如果我删除所有地址,我将得不到任何结果。

我试图在 SQL 中完成的等价物是:

select * from customers c
left join customer_addresses ca
on c.id = ca.customer_id
and c.markForDelete = 0
and ca.markForDelete = 0;

它有效并给我一个结果。

最佳答案

好的,在这里使用类似的数据,我发现以下查询应该可以满足您的要求:

SELECT DISTINCT c FROM Customer c
LEFT JOIN FETCH c.createUser
LEFT JOIN FETCH c.lastUpdateUser
LEFT JOIN FETCH c.addressBook a
WHERE c.id = 1 AND c.markForDelete = false
AND (SIZE(c.addressBook) = 0 OR a.markForDelete = false)

请注意,我发现 DISTINCT 很重要,否则我会得到重复的数据(在您的案例中是客户)。

此外,返回的具有地址的客户不会返回该客户的所有地址。附加列表将仅包含具有 markForDelete false 的地址。

关于jpa - 如何过滤jpa查询中的左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31480493/

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