Spring Boot JPA 根据关联关系过滤数据

3
我的项目中有三个实体。实体A(eA)与实体B(eB)存在一对多的关系,而eB与实体C(eC)也是一对多的关系。我在它们所有的地方都使用了fetch = eager。
我想要获取嵌套的eB和eC的eA,但我只想从eC中获取特定的条目。我创建了一个简单的查询,如下所示。
SELECT eA.* from eA
INNER JOIN eB on eA.eB_id = eB.id
INNER JOIN eC on eB.eC_id = eC.id
WHERE eC.id IN (1,2,3)

当我直接在数据库中运行此查询时,它似乎实际上可以工作,但是当我在我的存储库中创建函数时,它会返回来自eB和eC的所有数据以及基于WHERE子句的正确数据。

我尝试将fetch切换为lazy,但没有成功。

您有任何想法如何实现这一点吗?

谢谢!


你有JPA查询吗?我不确定在关系之前过滤的支持程度如何。我找到了一个相关的问题:https://stackoverflow.com/questions/60863789/select-only-a-subset-of-an-entities-collection - XtremeBaumer
看起来相关,但如果是这种情况,函数将会是findeAsByeBsByeCs(或类似的名称),这似乎是不可能的,因为我需要将该子句应用于“第三级”。 - Sotiris Oik
1个回答

1
您应该能够在您的存储库接口中使用派生查询方法,无需SQL。Spring Data可以仅基于存储库方法的名称和其参数类型推导出查询。这是一个强大的功能,有助于避免手动编写SQL或JPQL查询的需要。这里是另一个有用的解释,其中包含一些示例。
对于您的情况,过滤嵌套对象的存储库方法名称可能会有些复杂,但可行。确切的存储库方法名称取决于实体类中的字段名称,您没有向我们展示这些字段名称。因此,假设存在以下类(省略注释):
public class A {
    private long id;
    private Collection<B> entityBs;
}

public class B {
    private long id;
    private Collection<C> entityCs;
}

public class C {
    private long id;
}

存储库方法将如下所示:
public interface EntityARepository extends JPARepository<A, long> {
    Collection<A> findByEntityBsEntityCsIdIn(long[] ids);
}

repo方法的返回类型可以是其他类型,具体取决于您希望如何返回结果,如此文档所述

谢谢提供信息!我使用了JPA Buddy,它帮了大忙,但不幸的是结果仍然相同。我传递了id,但我得到了每个EntityB,而在每个EntityB中我得到了每个EntityC。 - Sotiris Oik
我知道这个可以,因为我以前做过(不是嵌套3层深度,而是2层)。这里是另一个基本相同的SO问答 - E-Riz
是的,我知道它也可以工作。我以前用过它。现在似乎它能够工作。我能得到结果,但却得到了实体C的所有行。它们没有被我传递的ID参数过滤掉。 - Sotiris Oik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接