按条件排序HQL

时间:2012-03-28 12:49:44

标签: sql hibernate sql-order-by hql

我有以下表格:

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中为空,我如何通过其他列进行排序?

谢谢

1 个答案:

答案 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%正确)。