java - 应该如何使用查询条件过滤持久集

标签 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 查询,用于根据 FeeHeadingFeeGroupisActive 值获取结果。

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 且至少有一个带有 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

关于java - 应该如何使用查询条件过滤持久集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48334261/

相关文章:

java - 如何在 List<List<Integer>> 中迭代并设置它们的值,就像我们在普通 int a[i][j] 矩阵类型中所做的那样

java - 调试 Maven 依赖问题的技巧

java - 使用三元数组对Arrays.asList(T…)的不同行为

Java JPA 和 Java JDBC 对于同一 MySQL 查询返回不同的结果

java - 在 hibernate 状态下可连接多对多

hibernate - 如何在 Tomcat 和 Glassfish 上使用相同的连接数据源?

mysql - Hibernate 生成交叉连接而不是左连接

java - 使用休息时的网址最大长度( Jersey )

java - Spring data JPA,hql查询在选择请求中加入@ManyToMany关系

sql - Grails 在没有域关系的表上查询 LEFT JOIN