使用休眠条件时,仅更改连接类型会影响根域类的子集合的结果。
例如,让类 Parent 与具有以下数据的类 Child 具有一对多的关系:
家长 | 编号 | 姓名 | | 1 | 家长 1 | 孩子 | 编号 | parent_id | 姓名 | | 1 | 1 | 孩子1 | | 2 | 1 | 孩子2 |
使用以下休眠条件返回 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)。
- 编辑 3/24:固定数据 *