按(链式)列排序,可以为null

时间:2012-09-20 16:36:36

标签: hibernate null sql-order-by hql

我目前遇到Hibernate的问题,我自动创建一个看起来像

的HQL语句
FROM table ORDER BY a.b ASC NULLS LAST

我的目的是按a.b订购所有参赛作品,并将abNULL的所有参赛作品设置到表格末尾。 Hibernate不会抱怨该语句,只是忽略a已经NULL的所有条目。我尝试了设置:

FROM table ORDER BY NULLIF(a.b, NULL) ASC NULLS LAST

再次,Hibernate不会抱怨,但会再次忽略aNULL的所有条目。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我猜a是table_two类型的属性,并且此属性使用多对一关系或sth定义。类似。

您对不是表的成员但是相关table_two的列进行排序。 Sql不能直接执行此操作,Hibernate通过在table和table_two之间生成连接来实现此目的。 Hibernate生成的这种连接是普通连接,而不是外连接,因此select不会获取table_two中没有相关条目的行。

您可以通过手动定义外部联接来解决问题。这样的事情应该有效:

FROM table t
   LEFT OUTER JOIN t.a u
   ORDER BY u.b ASC NULLS LAST

答案 1 :(得分:1)

感谢您的回答,我找到了一个更容易实现的不同解决方案。我现在创建一个请求如下:

FROM table ORDER BY a ASC NULLS LAST, a.b ASC NULLS LAST

对我来说,只要这些订单合适,这适用于任何尺寸的链条。由于查询是自动生成的,因此我更容易实现。但是,谢谢你的建议。我试过了,你的解决方案也可以正常工作,但需要我调整我的整体设置。

答案 2 :(得分:1)

我刚遇到同样的问题,我执行了左外连接...我有一个CostOrder域,Order属性是一个嵌套关系实例;这可能是NULL。为了更加清晰,即:

class Cost { 
    User  owner 
    Order order 
    etc...
}

Cost.executeQuery('SELECT c FROM Cost AS c LEFT OUTER JOIN c.order AS o WHERE c.owner = ? ORDER BY o.orderNumber ASC, c.id DESC' , cost_qry_params, params)

你可以把你的分页/排序信息放在参数中......希望这有助于某人:)