你好我使用的是Grails 2.1,我有一点问题,我找不到一个好的解决方案。我正在查询数据库中的某些对象,它返回并按预期排序,但有一个例外,空值是第一个。
以下是我可用于查询数据库的代码:
Object.findAllByObjectTypeAndDateBetween(ObjectType.REGULAR, startDate, stopDate).sort {it.str}
有什么方法可以按字符串排序并将所有空值最后而不是第一个?我正在寻找一种简单的方法,不是这样的: Grails/Hibernate: how to order by isnull(property) to get NULLs last?
感谢。
答案 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 }