应该怎样做才能使用查询条件

时间:2018-01-19 04:47:31

标签: java hibernate hql one-to-many persistent-set

我有两个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查询,用于根据isActiveFeeHeading的{​​{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,即使条件已经给出,或者我应该在查询中做些什么来过滤它?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在第一个声明中,您选择了所有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