在sort闭包中,如何获取null值?

时间:2012-11-13 15:13:50

标签: hibernate grails groovy

你好我使用的是Grails 2.1,我有一点问题,我找不到一个好的解决方案。我正在查询数据库中的某些对象,它返回并按预期排序,但有一个例外,空值是第一个。

以下是我可用于查询数据库的代码:

Object.findAllByObjectTypeAndDateBetween(ObjectType.REGULAR, startDate, stopDate).sort {it.str}

有什么方法可以按字符串排序并将所有空值最后而不是第一个?我正在寻找一种简单的方法,不是这样的: Grails/Hibernate: how to order by isnull(property) to get NULLs last?

感谢。

2 个答案:

答案 0 :(得分:9)

你可以这样做:

objects.sort { a, b ->
  !a.str ? !b.str ? 0 : 1 : !b.str ? -1 : a.str <=> b.str
}

扩大解释:

objects.sort { a, b ->
  if( !a.str ) {             // If a.str is null or empty
    if( !b.str ) {           // If b.str is null or empty 
      return 0               // They are the same
    }
    else {                   // a.str is empty or null, but b.str has value
      return 1               // b.str should come before a.str
    }
  else {                     // a.str has value
    if( !b.str ) {           // b.str is null or empty
      return -1              // b.str should come after a.str
    }
    else {                   // Both have value, 
      return a.str <=> b.str // Compare them 
    }
  }

这将在列表的末尾放置空字符串空字符串,并按字母顺序对其余字符串进行排序

如果你想要列表头部的空字符串(以及尾部的空字符串),你需要显式检查null而不是依赖Groovy Truth:

objects.sort { a, b ->
  a.str == null ? b.str == null ? 0 : 1 : b.str == null ? -1 : a.str <=> b.str
}

答案 1 :(得分:0)

我想你可以使用:

Object.findAllByObjectTypeAndDateBetween(ObjectType.REGULAR, startDate, stopDate).sort{a, b-> null == a || null == b ? 1 : a <=> b }