2011-02-03 140 views
17

踩在这个上面。在Grails中,似乎无法在域映射拉丁静态映射中的多个列上定义默认排序:{sort'prop1 desc,prop2 asc'}或{sort([prop1:'desc',prop2:'asc']) }。只有第一列被排序,跛脚。对多个字段进行Grails映射排序::对多个映射条目进行Groovy排序

同样,当尝试Groovy对多列上的Grails findAllBy查询进行排序时,第二种排序会覆盖第一个排序。

DEF列表= [[的rowNum:2,位置:3],[的rowNum:1,位置:2],[的rowNum:3,位置:1]]

list.sort {it.rowNum} .sort {it.position}

明显错过了后一种情况下的船,时髦的排序。我已经看过帖子:实施可比较的,但如果可能的话,寻找更简洁的东西。

+0

工作对我来说有这个古老而悬而未决的要求:http://jira.grails.org/browse/GRAILS-5306 – GreenGiant 2013-04-04 14:35:11

回答

30

这是一个Groovy解决方案。尽管如此,仍然基本上实现了比较器

list.sort { map1, map2 -> map1.rowNum <=> map2.rowNum ?: map1.position <=> map2.position } 
+1

刚刚看到没有在控制台中测试 - 这将实现与HQL查找相同(“按照rowNum asc,position desc从SomeDomain的顺序”)? – virtualeyes 2011-02-03 08:03:01

+0

美味; - )证实它的工作; 1-liner非常好。如果我们可以在grails中进行映射级别的工作,那将会很好,但是这可能需要等待1.4和新的hibernate。谢谢彼得! – virtualeyes 2011-02-03 08:07:47

0

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

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

感谢来自GreenGiant链接,我们看到,作为固定为2.3版本的问题被关闭。

还有示例代码:

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

它在2.4.3