Grails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序

Posted

技术标签:

【中文标题】Grails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序【英文标题】:Grails mapping sort on multiple fields :: Groovy sort on multiple map entries 【发布时间】:2011-06-20 11:01:07 【问题描述】:

难倒这个。在 Grails 中,似乎无法在域映射中的多个列上定义默认排序 la static mapping = sort 'prop1 desc, prop2 asc' 或 sort([prop1:'desc', prop2:'asc']) 。只有第一列被排序,la脚。

类似地,当尝试对 Grails findAllBy 查询在多个列上进行 Groovy 排序时,第二个排序会覆盖第一个。

def list = [[rowNum:2,position:3],[rowNum:1,position:2],[rowNum:3,position:1]]

list.sortit.rowNum.sortit.position

显然在后一种情况下错过了船,即常规排序。我看过帖子:实现可比性,但如果可能的话,请寻找更简洁的东西。

【问题讨论】:

有一个旧的但未解决的请求:jira.grails.org/browse/GRAILS-5306 【参考方案1】:

这是一个 Groovy 解决方案。不过,本质上仍然是在实现 Comparator。

list.sort  map1, map2 -> map1.rowNum <=> map2.rowNum ?: map1.position <=> map2.position 

【讨论】:

刚刚看到还没有在控制台中测试——这将与 HQL find("from SomeDomain as s order by rowNum asc, position desc") 相同? Tasty ;--) 确认它有效; 1-liner 非常好。如果我们可以在 grails 的映射级别上做会很好,但这可能需要等待 1.4 和新的休眠。谢谢彼得! 宇宙飞船和猫王操作员的组合使其超级干净 @virtualeyes 这个不像HQL排序,需要自己找集合,然后对它进行排序【参考方案2】:

感谢 GreenGiant 的链接,我们看到该问题已在 2.3 版中修复。

还有示例代码:

static mapping =
     sort([lastname:'asc', name:'asc']) 

它在 2.4.3 中为我工作

【讨论】:

【参考方案3】:

如果您知道最大长度,则可以使用 String.format。我假设最大长度为 10:

list.sort  String.format('%010d%010d', it.rowNum, it.position) 

【讨论】:

谢谢,我在发布后不久(4 年前)就离开了 Grails,不过可能会帮助其他人 ;-)

以上是关于Grails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何按 Grails 中的多个字段排序?

如何在Grails的多个字段中订购?

集合List根据多个字段进行排序

如何根据多个因素对 Scala 中的“映射”值进行排序?

Grails:将枚举类型的mysql字段映射到域类

usort 对多个字段进行排序