当使用左联接条件时,Hibernate子集合受到限制

当使用左联接条件时,Hibernate子集合受到限制,hibernate,criteria,hibernate-criteria,Hibernate,Criteria,Hibernate Criteria,使用hibernate条件时,仅更改联接类型会影响根域类的子集合的结果 例如,让类父级与具有以下数据的类子级具有一对多关系: Parent | id | Name | | 1 | Parent 1 | Child | id | parent_id | Name | | 1 | 1 | Child1 | | 2 | 1 | Child2 | 但是,当使用左联接更改上述代码时,将返回1父行,但在访问子集合时仅返回匹配的子行 session.cre

使用hibernate条件时,仅更改联接类型会影响根域类的子集合的结果

例如,让类父级与具有以下数据的类子级具有一对多关系:

Parent | id | Name | | 1 | Parent 1 | Child | id | parent_id | Name | | 1 | 1 | Child1 | | 2 | 1 | Child2 | 但是,当使用左联接更改上述代码时,将返回1父行,但在访问子集合时仅返回匹配的子行

session.createCriteria(Parent.class)
    .createCriteria('child', CriteriaSpecification.LEFT_JOIN)
    .add( Restrictions.eq( 'name', 'Child1' ) )
    .list()
为什么会出现这种副作用?我发现了一些关于使用或避免这种副作用的讨论,这取决于你的预期结果,但没有讨论为什么会有这种副作用,以及它是否是预期的。最直接的问题是一个陈旧的缺陷()

  • 编辑3/24:固定数据*
我已经尝试过: 在执行此查询并随后获取调用的parent.getChildren()时,请执行以下操作:

  • 左联接:执行一个包含父项和一个匹配子项的查询,调用getChildren()时不执行后续查询
  • 内部联接:执行两个查询:一个用于查找具有匹配子项的父项,另一个用于调用getChildren()时
因此,似乎在调用LEFT_JOIN时,会急切地获取子级(在本例中是匹配的子级),并且父级的children集合已经填充。 但是,对于内部_连接,此集合标记为代理,并在调用getChildren()时初始化;当然,第二个查询将不再考虑对名称的限制,而只是获取父级的所有子级

这似乎发生在hibernate的“内部”,这意味着连接类型将影响hibernate处理结果的方式。尽管左联接和内部联接之间生成的SQL略有不同(在我的测试中,select子句中的parent.id和child.id是两次),但在DB浏览器中运行SQL时返回的结果是相同的


我没有足够的经验来判断这是否是一个bug,但我感觉它不像一个bug。

这里描述了这个问题,并且似乎在Hibernate 3.6中得到了修复


伙计,我所有的知识都告诉我,内部连接只能获取一行。我想你有什么事。我会把它加入书签,这样就可以知道我遗漏了什么。如果我是的话,我会非常感谢你。孩子2上的家长id错了吗?是不是应该是1?@MikelRascher-是的,孩子2的父母id是错误的。我现在已经修好了。
session.createCriteria(Parent.class)
    .createCriteria('child', CriteriaSpecification.LEFT_JOIN)
    .add( Restrictions.eq( 'name', 'Child1' ) )
    .list()