Hibernate генерирует перекрестное соединение вместо левого соединения

Я использую hibernate 3.6.10.Final и MySQL 5.5.

Я написал такой динамический запрос:

"from " + clazz.getName()+ " ORDER BY "+sortField+" "+sortDirection

Мои объекты в спящем режиме имеют отношения «многие к одному» родитель / потомок. если запрос упорядочен по полю от родителя, hibernate генерирует этот hql select:

select parent0_.ID as ID10_, parent0_.ID_CHILD as ID6_10_ 
from parent parent0_
order by parent0_.PARENTFIELD ASC

если запрос упорядочен по полю из дочернего элемента, у меня будет следующий hql:

select parent0_.ID as ID10_, parent0_.ID_CHILD as ID6_10_
from parent parent0_
cross join child1_
where parent0_.ID_CHILD = child1_.ID
order by child1_.CHILDFIELD ASC

Второй запрос возвращает меньше результатов, потому что parent0_.ID_CHILD может иметь значение NULL. Есть ли способ заставить спящий режим генерировать левое соединение?

Мне нужно что-то вроде этого

select parent0_.ID as ID10_,
   parent0_.ID_CHILD as ID6_10_
from
parent parent0_
    left join
child child1_
on
parent0_.ID_CHILD = child1_.ID
order by child1_.CHILDFIELD ASC

person Tostis    schedule 10.03.2013    source источник
comment
Это ответ? Я не хочу писать конкретный запрос для моих родительских и дочерних сущностей. Я хочу повторно использовать этот общий запрос, заставляющий спящий режим брать родителей с нулевым дочерним элементом.   -  person Tostis    schedule 10.03.2013
comment
Тогда вам понадобится запрос с явным левым соединением. Нет никакого способа обойти это. child.parent.someProperty всегда будет генерировать внутреннее соединение. Прочтите документацию. Это там.   -  person JB Nizet    schedule 10.03.2013


Ответы (1)


Благодаря JB Nizet я решил написать такой запрос:

String[] tokens = sortField.split("\\.");
for(int i=0;i<tokens.length-1;i++)
{
    sortby+=" LEFT JOIN parent"+i+"."+tokens[i]+" as child"+i;
}
sortby+=" ORDER BY child"+(tokens.length-2)+"."+tokens[tokens.length-1]+" "+sortDirection;
...
String query = "select parent0 FROM " + clazz.getName()+" as parent0 "+ sortby;
person Tostis    schedule 13.03.2013