2013-03-10 2 views
1

Я использую hibernate 3.6.10.Final и MySQL 5.5.Hibernate генерирует перекрестное соединение вместо левого соединения

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

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

Мои Hibernate лиц имеют отношения/ребенок многих один родитель. если запрос упорядочено поля от родителя, спящий режим генерирует этот HQL выбор:

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 может быть нулевым. Есть ли способ заставить спящий режим сгенерировать левое соединение?

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

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 
+0

Это ответ? Я не хочу писать конкретный запрос для родительских и дочерних объектов. Я хочу повторно использовать этот общий запрос, заставляющий спящий режим брать родителей с нулевым ребенком. – Tostis

+1

Затем вам нужен запрос с явным левым соединением. Об этом нет. 'child.parent.someProperty' всегда будет генерировать внутреннее соединение. Прочтите документацию. Он там. –

ответ

2

Благодаря 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; 
Смежные вопросы