我有两个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
查询,用于根据isActive
和FeeHeading
的{{1}}值获取结果。
FeeGroup
id为78的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
下有10 FeeGroup
个,只有一个标题的isActive为1.即使我已将过滤条件设为{,当前查询也会返回10条记录{1}}。但是当我将查询更改为
FeeHeading
只有一条记录即将到来,这是唯一的有效记录。那么为什么我首先没有得到过滤的fh.isActive = 1
,即使条件已经给出,或者我应该在查询中做些什么来过滤它?
答案 0 :(得分:1)
在第一个查询中,您选择组中的所有标题,其中(组)至少有一个标题满足条件。即你小组的所有10个标题。
在第二个查询中,您只选择满足条件的标题。即只有一个标题。
答案 1 :(得分:1)
在第一个声明中,您选择了所有FeeGroups
并返回其关联的FeeHeadings
。您无法创建查询父对象的列表子列表。 JPA正在过滤您的查询,然后必须使用完整的元素加载所有请求的对象。如果FeeGroup
符合您的要求(id
= 78且isOptional
= 0且至少有一个FeeHeading
且isActive
= 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