1

我有两个 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获取结果的查询。isActiveFeeHeadingFeeGroup

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

FeeGroupid 为 78 的下面有 10秒FeeHeading,只有一个标题的 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即使给出了条件,我也没有首先得到过滤,或者我应该在查询中做什么来过滤呢?

4

2 回答 2

1

在第一个查询中,您从组中选择所有标题,其中(组)至少有一个标题满足条件。即您组中的所有 10 个标题。

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

于 2018-01-19T05:19:54.397 回答
1

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

在您的第二个查询中,您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
于 2018-01-19T05:21:22.017 回答