应该怎么做才能使用查询条件过滤 Persistent Set

What should be done to get the Persistent Set filtered using a query condition

我有两个像这样的 DAO 类 FeeGroupFeeHeading

class FeeGroup {
    private int id;
    private String name;
    private Set<FeeHeading> feeHeadings;
    private booelan isActive;
    //getters & setters
}
class FeeHeading {
    private int id;
    private String name;
    private FeeGroup feeGroup;
    private booelan isActive;
    //getters & setters
}

这是 HQL 查询,用于根据 FeeHeadingFeeGroupisActive 值获取结果。

select fg.feeHeadings 
from FeeHeading fh 
join fh.feeGroup fg
where fg.isActive = 1
and fg.isOptional = 0
and fh.isActive = 1
and fg.id = 78

ID 为 78 的 FeeGroup 下有 10 个 FeeHeadings,只有一个标题的 isActive 为 1。即使我给出了过滤条件,当前查询也返回 10 条记录作为 fh.isActive = 1。但是当我将查询更改为

select fh.name 
from FeeHeading fh 
join fh.feeGroup fg
where fg.isActive = 1
and fg.isOptional = 0
and fh.isActive = 1
and fg.id = 78

只有一个记录即将到来,这是唯一的活动记录。那么,为什么我一开始就没有得到过滤的 Set,即使给出了条件,或者我应该在查询中做什么来过滤它?

在第一个查询中,您 select 组中至少有一个标题的所有标题都满足条件。 IE。您组中的所有 10 个标题。

在第二个查询中,您 select 只有满足条件的标题。 IE。只有一个标题。

在第一个语句中,您选择了所有 FeeGroups 并返回它们关联的 FeeHeadings。您不能创建查询父对象的列表的子列表。 JPA 正在过滤您的查询,然后必须使用完整的元素加载所有请求的对象。如果 FeeGroup 满足您的要求(id = 78 和 isOptional = 0 以及至少一个 FeeHeadingisActive = 1),它必须加载完整的组。

在您的第二个查询中,您直接选择 FeeHeadings,因此您可以创建它们的子列表,因为 JPA 必须只创建该对象。

更新

目前尚未测试,但您可以测试以下 JPQL 是否为您提供所需的结果:

select fh
from FeeHeading fh 
where fh.feeGroup.isActive = 1
and fh.feeGroup.isOptional = 0
and fh.isActive = 1
and fh.feeGroup.id = 78