Grails/Hibernate:如何按isnull(属性)排序以最后获得null?

Grails/Hibernate:如何按isnull(属性)排序以最后获得null?,hibernate,grails,null,criteria,Hibernate,Grails,Null,Criteria,通常,当按字段升序排序时,首先得到空值,然后是更有趣的值。通常,您最后需要空值。在MySQL中,您可以通过以下方式执行此操作: 按ISNULL(name)、name从人员订单中选择* 然而,我使用的是带有Hibernate标准的Grails,我完全不知道如何在那里做到这一点。这是否得到了任何支持?是否有某种方法可以按自定义SQL表达式排序?我不想为了让它正确排序而将所有标准重写为纯SQL。恐怕它还没有进入Hibernate:这有一个解决方案 不过,可以使用该bug注释中的NativeSQLOrd

通常,当按字段升序排序时,首先得到空值,然后是更有趣的值。通常,您最后需要空值。在MySQL中,您可以通过以下方式执行此操作:

按ISNULL(name)、name从人员订单中选择*


然而,我使用的是带有Hibernate标准的Grails,我完全不知道如何在那里做到这一点。这是否得到了任何支持?是否有某种方法可以按自定义SQL表达式排序?我不想为了让它正确排序而将所有标准重写为纯SQL。

恐怕它还没有进入Hibernate:这有一个解决方案


不过,可以使用该bug注释中的
NativeSQLOrder
,并尝试向
HibernateCriteriaBuilder
中注入适当的函数。您只需将
sqlOrder
方法添加到
HibernateCriteriaBuilder
类,其操作与在hibernate中执行的
HibernateCriteriaBuilder.order()
大致相同,您可以使用以下代码进行尝试:

标准c=


c、 addOrder(Order.asc(“name”).nulls(nullpreference.LAST))

如果您想在GORM中排序并HibernateCriteriaBuilder设置空优先级,AbstractHibernateCriteriaBuilder提供了一种方法,您可以像常规hibernate一样设置org.hibernate.criteria.order

范例

     People.createCriteria().list (){
          order(org.hibernate.criterion.Order.asc('name')
                . nulls(org.hibernate.NullPrecedence.LAST)
           )
     }

看起来Hibernate的“bug”已经修复。我希望看到更新后的答案。grails标准也可以这样做。。def userCriteria=User.createCriteria()userCriteria.addOrder(Order.asc(FIRST_NAME).nulls(nullpreference.LAST));