使用hibernate条件时,仅更改联接类型会影响根域类的子级集合的结果。
例如,让Parent类与Child类具有一对多关系,并具有以下数据:
Parent | id | Name | | 1 | Parent 1 | Child | id | parent_id | Name | | 1 | 1 | Child1 | | 2 | 1 | Child2 |
使用以下hibernate条件返回1父行,访问子集合结果将返回两行:
session.createCriteria(Parent.class) .createCriteria('child', CriteriaSpecification.INNER_JOIN) .add( Restrictions.eq( 'name', 'Child1' ) ) .list()
但是,当通过左连接更改上述代码时,将返回1父行,但是在访问子集合时仅返回匹配的子行。
session.createCriteria(Parent.class) .createCriteria('child', CriteriaSpecification.LEFT_JOIN) .add( Restrictions.eq( 'name', 'Child1' ) ) .list()
为什么会出现这种副作用?我发现了一些关于使用或避免这种副作用的讨论,具体取决于您的预期结果,但没有任何关于为什么出现这种副作用以及是否达到预期目的的讨论。最直接的问题是一个陈旧的陈旧缺陷(http://opensource.atlassian.com/projects/hibernate/browse/HHH-3872)。
此问题已在此处进行描述,并且似乎已在Hibernate 3.6中修复。
https://hibernate.onjira.com//browse/HHH-2049