我有两个 DAO 类 FeeGroup
和 FeeHeading
像这样
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
查询,用于根据 FeeHeading
和 FeeGroup
的 isActive
值获取结果。
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 个 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
只有一个记录即将到来,这是唯一的 Activity 记录。那么,为什么即使给出了条件,我一开始也没有得到过滤的 Set
,或者我应该在查询中做什么来过滤它?
最佳答案
在第一个语句中,您选择所有 FeeGroups
并返回其关联的 FeeHeadings
。您无法创建查询父对象的列表的子列表。 JPA 正在过滤您的查询,然后必须加载所有请求的对象以及完整的元素。如果 FeeGroup
满足您的要求(id
= 78 且 isOptional
= 0 且至少有一个带有 的
= 1) 它必须加载完整的组。FeeHeading
isActive
在第二个查询中,您直接选择 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
关于java - 应该如何使用查询条件过滤持久集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48334261/