- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我担心我可能已经表达了我的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
列表中看到这一点?他们只会有一些 Region
和 RegionGroup
有人口吗?
换句话说,假设我有一个 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/
我需要创建一个 Hibernate 标准限制,或者 3 个条件。问题是最后一个条件实际上是使用 AND 运算符的条件。 我的第一个条件: Criterion startInRange = Restri
假设我的类型为 User,其中包含带有属性 Name 的类 Tenant 的对象。 我想从数据库用户中选择,其租户包含给定名称。 在 Hibernate Criteria 中,我可以使用别名简单地实现
select (case when dob = '2020-02-03' then 'adult' else 'teenage' end) as Age
我正在使用 Java 中的 hibernate 条件进行 MySql 查询。我在下面给出了我的代码的小快照。 Criteria criteria = getCurrentSession
我正在尝试使用条件查询进行删除。但看起来不错,但在运行时显示错误。我收到如下错误: Caused by: java.lang.AbstractMethodError: org.hibernate.ej
我目前正在尝试实现半边折叠以执行增量重新网格化。我正在处理流形网格。考虑以下简单网格: 目标是将 a 折叠成 b。 然而,在这种情况下,这会导致非流形网格 我想阻止。我的问题是: 我怎样才能提前做到这
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在考虑为我的应用使用 Firebase Analytics。我很好奇: 保留的标准是什么?保留是否跟踪具有我必须发送的唯一 ID 或唯一设备的用户帐户? 如果用户从多个设备登录到我的应用程序,我将
我想测试一个“withCriteria”闭包,但不知道如何去做。我看到了如何模拟 withCriteria 调用,但没有测试闭包中的代码。在运行执行“withCriteria”的测试时,我不断收到 M
如何从以下 sql 创建 Hibernate 条件查询? String hql = "select e.employeeId,m.meetingId,e.firstname from Employee
我担心我可能已经表达了我的previous question很糟糕,所以为了清楚起见,我重新开始。 想象许多表,每个表之间存在 OneToMany 关联; 农场 -> 田地 -> RegionGrou
我将如何使用条件 API 执行以下 Hibernate 查询。我有一个对象 Parent 和 List Children。我想搜索所有 parent 并找到哪些 parent 包含指定的 child
我正在使用 Oracle,目前无法实现我需要的查询。 假设我有下表: - ID Date Type Value - 1 01/12/2016 prod 1 - 2
有没有办法用 JPA 2 CriteriaBuilder 编写与以下查询等效的内容? select * from season s1 where end = ( select max(end)
背景 我们定期对多个项目进行测试,并产生测试结果(通过或失败)。单个测试可以应用于多个项目,单个项目可以对其进行多个不同的测试。 我们需要做的是生成当前未通过测试的所有项目/测试组合的列表,以及自上次
SQL: String hql1 = "SELECT /* PARALLEL(MVR,16) PARALLEL(MVRS,16)*/ * FROM ICM MINUS SELECT I1.* FRO
为什么这是不可能的? Criteria crit1 = sess.createCriteria(Criteria1Class.class); Criteria crit2 = crit1.creat
我通常在 hibernate 状态下使用 criteria.addOrder(Order.desc("myField")); 如何在不使用 hsql 的情况下在 Hibernate 中编写此语句? s
假设我有一个具有以下值的表 Plan。 planName(VARCHAR2) | validFrom(timestamp) | validTo(timestamp) -----------------
给定映射的 hibernate 类: @Entity public class MyTestClass { /* id and stuff */ private Integer aValue;
我是一名优秀的程序员,十分优秀!