При использовании критериев гибернации простое изменение типа соединения влияет на результаты дочерних коллекций корневого класса домена.
Например, наличие у класса Parent отношения «один ко многим» с классом Child со следующими данными:
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.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: фиксированные данные *