4

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

这是我可以用来查询数据库的代码:

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

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

谢谢。

4

2 回答 2

11

你可以这样做:

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 
    }
  }

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

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

objects.sort { a, b ->
  a.str == null ? b.str == null ? 0 : 1 : b.str == null ? -1 : a.str <=> b.str
}
于 2012-11-13T15:24:14.690 回答
0

我想你可以使用:

Object.findAllByObjectTypeAndDateBetween(ObjectType.REGULAR, startDate, stopDate).sort{a, b-> null == a || null == b ? 1 : a <=> b }
于 2012-11-13T15:25:17.367 回答