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 对多个映射条目进行排序的主要内容,如果未能解决你的问题,请参考以下文章