应该怎么做才能使用查询条件过滤 Persistent Set
What should be done to get the Persistent Set filtered using a query condition
我有两个像这样的 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
s,只有一个标题的 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 以及至少一个 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
我有两个像这样的 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
s,只有一个标题的 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 以及至少一个 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