【问题标题】:Grails mapping sort on multiple fields :: Groovy sort on multiple map entriesGrails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序
【发布时间】: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.sort{it.rowNum}.sort{it.position}

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

【问题讨论】:

标签: sorting grails groovy


【解决方案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,不过可能会帮助其他人 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2018-01-15
    相关资源
    最近更新 更多