我有以下表格:
SN,D和C,链接如下:
SN包含FK到D(d_id)(ManyToOne),SN包含FK到C(c_id)(OneToOne),C具有FK到D(d_id,OneToOne)。 D还包含(在其他列中包含字符串number
和字符串name
)。
现在,我有一个像这样的HQL查询:"from SN sn where (sn.d is not null or sn.c.d is not null)"
(因此,如果sn.d为null,则从sn.c.d获取d)。但是,这个集合应该可以通过d.number或d.name进行排序。因为在查询创建时我们不知道要对哪个“d”进行排序,我尝试过这样的:
"from SN sn where (sn.d is not null or sn.c.d is not null) order by coalesce (sn.d.name, sn.c.d.name)"
但它不起作用,我的结果比正常选择少;我也试过"order by case when sn.d is not null then sn.d.name else sn.c.d.name"
,但结果相同。
如果第一个在HQL中为空,我如何通过其他列进行排序?
谢谢
答案 0 :(得分:1)
我想问题是,你的表达式sn.d.name
迫使hibernate在内部加入表SN和D,效果是你没有获得sn.d为null的行,即使是sn.cd一片空白。与sn.c.d.name
相同。
尝试将SN和D之间的连接明确定义为外连接,如下所示:
from SN sn outer join D d inner join C c where (sn.d is not null or sn.c.d is not null) order by coalesce (d.name, c.d.name)
出于调试目的,我建议在hibernate.cfg.xml文件中设置<property name="show_sql">true</property>
。然后你可以检查从你的代码创建的语句hibernate有什么问题,或检查我的命题(我没有测试,它可能不是100%正确)。