Hibernate标准对儿童的限制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate标准对儿童的限制相关的知识,希望对你有一定的参考价值。

我有一个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();

这是一些示例数据:

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

我想要做的是如果其中一个孩子的属性等于我的绑定参数,则返回父母及其所有孩子。我们假设属性是一个包含{2}的数组。在这种情况下,调用将返回父项A和C,但它们的子集合将仅包含元素2。家长[儿童]:

A [2]&C [2]

我想要的是:

A [0,2,7]&C [1,2 3]

如果这不是一个bug,它似乎是一个破碎的语义。我不知道如何调用A.getChildren()或C.getChildren()并返回1条记录将被认为是正确的 - 这不是一个投影。即如果我扩充查询以使用默认的select fetch,它会返回正确的子集合,albiet包含大量查询:

  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();
另一答案

getChildren()只是getter / setter的名称,您的查询将确定如何填充对象。

我要在这里猜测第一部分是吐出来的

SELECT * FROM Parent 
INNER JOIN Child c ON ... 
WHERE c.property in (x,y,z) 

哪不能得到你想要的东西。如果你在原始SQL中编写它,你想做什么是:

SELECT * FROM Parent  
WHERE ParentID IN (SELECT DISTINCT parentID FROM Child WHERE  c.property in (x,y,z))

如果最后一个不产生此查询,则可以适当地重新排列您的标准。 (你还可以发布hibernate为每个人生成的内容吗?)

另一答案

我会和孩子一起开始Criteria。您将获得包含所有孩子的列表,然后您可以迭代并获取每个孩子的父母。

另一答案

这可以通过工作方式完成。

Criteria c1 = session.createCriteria(Child.class);
c1.add(Restrictions.in("property", properties));
c1.setProjection( Projections.distinct( Projections.property( "parentId" ) ) );
List<Integer> parentIds = c1.list();

Criteria c2 = session.createCriteria(Parent.class);
c2.createAlias("children", "children");
c2.add(Restrictions.in("id", parentIds));
return c2.list();

以上是关于Hibernate标准对儿童的限制的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 Hibernate 中使用限制和标准来实现“不在”?

如何在儿童版块中为 iOS 应用设置家长门

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

Hibernate JPA H2 问题中的“限制”列

儿童产品儿童秋千上架欧盟亚马逊CE认证EN71标准

如何对儿童可见度的变化做出反应?