我有一个 Hibernate 标准调用,我想在一个 SQL 语句中执行。我想要做的是选择 Parent 的实例,这些实例的 Children 的属性在一个值范围内(SQL IN 子句),同时使用外部连接加载子实例。这是我到目前为止所拥有的:
Criteria c = session.createCriteria(Parent.class);
c.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN)
.setFetchMode("c", FetchMode.JOIN)
.add(Restrictions.in("c.property", properties));
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return c.list();
这是一些示例数据:
Parent
Parent ID
A
B
C
Children
Child ID Parent ID property
... A 0
... A 2
... A 7
... B 1
... C 1
... C 2
... C 3
我想做的是返回 parent 和他们所有的 child ,如果其中一个 child 的属性等于我的绑定(bind)参数。假设 properties 是一个包含 {2} 的数组。在这种情况下,调用将返回父 A 和 C,但它们的子集合将仅包含元素 2。即父[子]:
A[2] & C[2]
我想要的是:
A[0, 2, 7] & C[1, 2 3]
如果这不是一个错误,它似乎是一个错误的语义。我不明白如何调用 A.getChildren() 或 C.getChildren() 并返回 1 条记录会被认为是正确的——这不是预测。 IE。如果我扩充查询以使用默认的选择提取,它会返回正确的子集合,尽管有大量查询:
c.createAlias("children", "c").add(
Restrictions.in("c.property", properties));
这是一个错误吗?如果没有,我怎样才能达到我想要的结果?
最佳答案
Criteria c = session.createCriteria(Parent.class);
c.createAlias("children", "children");
c.add(Restrictions.in("children.property", properties));
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return c.list();
关于java - 对 child 有限制的 hibernate 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7003861/