jon*_*one 8 java orm hibernate hibernate-criteria
我有一个Hibernate条件调用,我想在一个SQL语句中执行.我正在尝试做的是选择Parent的实例,其中Child具有一系列值的属性(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();
Run Code Online (Sandbox Code Playgroud)
这是一些示例数据:
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
Run Code Online (Sandbox Code Playgroud)
我想要做的是如果其中一个孩子的属性等于我的绑定参数,则返回父母及其所有孩子.我们假设属性是一个包含{2}的数组.在这种情况下,调用将返回父A和C,但他们的子集只包含元素2.即父[子]:
A [2]&C [2]
我想要的是:
A [0,2,7]&C [1,2 3]
如果这不是一个bug,它似乎是一个破碎的语义.我不知道如何调用A.getChildren()或C.getChildren()并返回1条记录将被认为是正确的 - 这不是一个投影.即如果我扩充查询以使用默认的选择提取,它将返回正确的子集合,带有大量查询的albiet:
c.createAlias("children", "c").add(
Restrictions.in("c.property", properties));
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?如果没有,我怎样才能达到预期的效果呢?
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();
Run Code Online (Sandbox Code Playgroud)
getChildren() 只是 getter/setter 的名称,您的查询将确定如何填充对象。
我猜第一部分已经出来了
SELECT * FROM Parent
INNER JOIN Child c ON ...
WHERE c.property in (x,y,z)
Run Code Online (Sandbox Code Playgroud)
这不会让你得到你想要的。如果您用原始 SQL 编写此代码,您想要执行的操作是:
SELECT * FROM Parent
WHERE ParentID IN (SELECT DISTINCT parentID FROM Child WHERE c.property in (x,y,z))
Run Code Online (Sandbox Code Playgroud)
如果最后一个条件没有生成此查询,则适当地重新排列您的条件可能会成功。(您还可以发布 hibernate 为每个生成的内容吗?)
| 归档时间: |
|
| 查看次数: |
15339 次 |
| 最近记录: |