При использовании критериев гибернации простое изменение типа объединения влияет на результаты дочерних коллекций класса корневого домена.
Например, наличие у класса 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: Фиксированные данные *