Hibernate标准对儿童的限制

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)

这是一个错误吗?如果没有,我怎样才能达到预期的效果呢?

bin*_*ary 5

        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)


dfb*_*dfb 0

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 为每个生成的内容吗?)