提问者:小点点

Hibernate生成交叉联接而不是左联接


我用的是hibernate 3.6.10.Final和MySQL 5.5。

我编写了一个动态查询,如下所示:

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

我的Hibernate实体有多对一的父/子关系。如果查询是由父字段排序的,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

第二个查询返回的结果较少,因为parent_0.ID_CHILD可以为空。有没有一种方法可以强制hibernate生成左联接?

我需要这样的东西

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

共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;