gpt4 book ai didi

Hibernate Criteria - 如何过滤嵌套子项?

转载 作者:行者123 更新时间:2023-12-03 06:59:27 26 4
gpt4 key购买 nike

我担心我可能已经表达了我的previous question很糟糕,所以为了清楚起见,我重新开始。

想象许多表,每个表之间存在 OneToMany 关联; 农场 -> 田地 -> RegionGroup -> 区域。我正在尝试构建一个将根据 Region. Nutrition 进行过滤的 Criteria 查询。我见过很多人们过滤顶层属性,有时过滤下一层属性的例子,但我不确定在过滤四层深度时如何构建查询。目前我有这个,但不起作用;

    Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Farm.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.setFetchMode("fields.regionGroups", FetchMode.JOIN)
.setFetchMode("fields.regionGroups.regions", FetchMode.JOIN)
.createCriteria("fields.regionGroups.regions").add(Restrictions.in("nutrient", nutrients));

所发生的情况是,生成了一个主 SQL 查询,该查询正确地涵盖了所需的结果(并且正是应该检索的数据集),但是,当您迭代返回的对象时,RegionGroup 的关联-> Region 在每次迭代时使用不包含限制的子查询执行,因此我得到了 RegionGroup 的所有 Regions,无论Region. Nutrition 的值;

select
...
from
Farm this_
inner join
Business business3_ on this_.BusinessID=business3_.BusinessID
left outer join
Field fields4_ on this_.FarmID=fields4_.FarmID
left outer join
RegionGroup regiongrou5_ on fields4_.FieldID=regiongrou5_.FieldID
inner join
Region region1_ on regiongrou5_.RegionGroupID=region1_.RegionGroupID
where
region1_.nutrient in ( ? )

-------------------------------------------

select
...
from
Region regions0_
where
regions0_.RegionGroupID=?

我需要添加什么才能强制执行针对关联路径“fields.regionGroups.regions”指定的限制?

编辑:以下 HQL 实现了我所追求的功能,但没有我所追求的定义灵 active ,因此我想将其转换为 Criteria 查询;

from Farm as farm
inner join fetch farm.fields as field
inner join fetch field.regionGroups as regionGroup
inner join fetch regionGroup.regions as region
where farm.id in :farmId
and field.id in :fieldId
and region.nutrient in :nutrients

这给了我一个输出 List<Farm>可以这样迭代;

Farm [shortName=XYZ, name=XYZ]
Field [shortName=COMM, name=Common]
RegionGroup [indexNo=1]
Region [nutrient=P, nutrientLevel=18.869684]
RegionGroup [indexNo=2]
Region [nutrient=P, nutrientLevel=18.836086]
RegionGroup [indexNo=3]
Region [nutrient=P, nutrientLevel=18.954369]

那么,如何将其指定为条件查询?为了证明它正在做我想要它做的事情,如果我简单地更改 HQL 并删除对 Region.nutrition 的限制,我会返回每个 RegionGroup 的所有 Region;

from Farm as farm
inner join fetch farm.fields as field
inner join fetch field.regionGroups as regionGroup
inner join fetch regionGroup.regions as region
where farm.id in :farmId
and field.id in :fieldId

在没有更改迭代结果的代码的情况下,我现在得到了这个;

Farm [shortName=XYZ, name=XYZ]
Field [shortName=COMM, name=Common]
RegionGroup [indexNo=1]
Region [nutrient=Mg, nutrientLevel=108.84927]
Region [nutrient=P, nutrientLevel=18.869684]
Region [nutrient=pH, nutrientLevel=6.727207]
Region [nutrient=K, nutrientLevel=189.04442]
RegionGroup [indexNo=2]
Region [nutrient=Mg, nutrientLevel=108.6944]
Region [nutrient=pH, nutrientLevel=6.7214856]
Region [nutrient=K, nutrientLevel=188.38605]
Region [nutrient=P, nutrientLevel=18.836086]
RegionGroup [indexNo=3]
Region [nutrient=K, nutrientLevel=190.72464]
Region [nutrient=pH, nutrientLevel=6.736169]
Region [nutrient=P, nutrientLevel=18.954369]
Region [nutrient=Mg, nutrientLevel=109.54382]

最佳答案

让我说清楚 - 您是否期望在返回的 Farm 列表中看到这一点?他们只会有一些 RegionRegionGroup有人口吗?

换句话说,假设我有一个 Farm与 2 Field s,每个有 2 RegionGroup s,每个有 2 Region并且只有其中 1 个 Region's has the您正在寻找的营养素。

当您运行查询时,您将得到 Farm实例返回(正如你应该的那样 - 它满足标准)。现在,您是否期望该实例只有 1 Field与 1 RegionGroup和 1 Region含有您的营养素吗?

这不会 - 不可能发生。 Hibernate 保证对象的内存表示与其持久状态相匹配(当然是刷新后),而执行类似上述的操作则与该原则相矛盾。如果可能的话,在您决定修改并保存该 Farm 后会发生什么? ? Hibernate 现在是否应该删除所有其他 Field s/等...来自数据库?

如果这不是您要问的问题,请澄清您的问题。

关于Hibernate Criteria - 如何过滤嵌套子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com