Hibernate 在排序闭包中,如何最后获得空值?

Hibernate 在排序闭包中,如何最后获得空值?,hibernate,grails,groovy,Hibernate,Grails,Groovy,您好,我正在使用Grails2.1,我有一个小问题,我找不到一个好的解决方案。我正在查询数据库中的一些对象,它返回并按预期对其排序,但有一个例外,空值是第一个 以下是我可以用来查询数据库的代码: Object.findAllByObjectTypeAndDateBetween(ObjectType.REGULAR, startDate, stopDate).sort {it.str} 有没有办法按字符串排序,最后而不是第一个获取所有空值?我在寻找一个简单的方法,不是这样: 谢谢。您可以这样做

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

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

Object.findAllByObjectTypeAndDateBetween(ObjectType.REGULAR, startDate, stopDate).sort {it.str}
有没有办法按字符串排序,最后而不是第一个获取所有空值?我在寻找一个简单的方法,不是这样:

谢谢。

您可以这样做:

objects.sort { a, b ->
  !a.str ? !b.str ? 0 : 1 : !b.str ? -1 : a.str <=> b.str
}
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 
    }
  }
objects.sort{a,b->
如果(!a.str){//如果a.str为null或空
如果(!b.str){//如果b.str为null或空
返回0//它们是相同的
}
else{//a.str为空或null,但b.str具有值
返回1//b.str应位于a.str之前
}
否则{//a.str有值
如果(!b.str){//b.str为null或空
return-1//b.str应位于a.str之后
}
否则{//两者都有价值,
返回a.str b.str//比较它们
}
}
这将把空字符串和空字符串放在列表的末尾,并按字母顺序对其余字符串排序

如果希望将空字符串放在列表的开头(将null放在末尾),则需要显式检查null,而不是依赖Groovy Truth:

objects.sort { a, b ->
  a.str == null ? b.str == null ? 0 : 1 : b.str == null ? -1 : a.str <=> b.str
}
objects.sort{a,b->
a、 str==null?b.str==null?0:1:b.str==null?-1:a.str b.str
}
我想您可以使用:

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

谢谢,您一如既往地提供了帮助:)不幸的是,我遇到了一个异常,说它无法比较值。
无法使用第一个解决方案比较值为“Avalue”的project.Str和值为“Anothervalue”的project.Str。
。我希望后面的内容都是空的。但是,只有1个空值,没有空字符串.@cubsink是
it.str
字符串?如果不是,它是可比较的类吗?@cubsink通过展开三元运算符添加了解释。请尝试使用空引用:
it.str?.name
operator@cubsink尝试最新版本,我犯了一个错误,遗漏了三元的一半:-/对不起,您的解决方案甚至没有在恐怕是正确的值。我认为您缺少了。如果要从数据库排序,请检查此项如果要从数据库排序,请检查此项