在Grails/GORM中定义默认排序顺序

17

假设我已使用GORM定义了一个用户对象。每个用户可以拥有零个或多个登录。每个登录都有一个时间戳。当检索user.logins时,我希望按照login.date的值对登录进行排序。在Grails中实现这一点的正确方法是什么?

示例:我想让以下代码按升序列出所有用户的登录。

<g:each var="login" in="${user.logins}">
  <tr>
    <td>${login.date}</td>
  </tr>
</g:each>

这些是被引用的类:

class User {
  ...
  def hasMany = [logins: Login]
  static fetchMode = [logins: "eager"]
}

class Login {
  Date date
  ...
  def belongsTo = [User]
}

我正在运行最新稳定版本的Grails 1.0.4。

3个回答

30

他们在参考指南(第5节)的GORM页面上展示了如何做到这一点。你想要的部分在那个文档的底部,那就是你想要的部分。他们有两个简单的例子:

class Airport {
    …
    static mapping = {
        sort "name"
    }
}

class Airport {
    …
    static mapping = {
        sort name:"desc"
    }
}

他们还提供了一个关于关联排序的示例:

class Airport {
    …
    static hasMany = [flights:Flight]
    static mapping = {
        flights sort:'number'
    }
}

2
如果您想要按关联降序排列:flights sort:'number', order: 'desc'(参考 http://grails.1312388.n4.nabble.com/sort-by-association-descending-td1312425.html) - Jeff Allen
1
我该如何对多个属性进行排序? - ricardogobbo
1
可能有点晚了,但是这里是你需要的代码:static mapping = { sort([column1: 'asc', column2: 'asc']) } - Gideon

14

只需让“Login Class”实现“Comparable”接口:

class Login implements Comparable {

    // ...

    Date date

    public int compareTo(def other) {
        return date <=> other?.date // <=> is the compareTo operator in groovy
    }

}

并声明这个关系为 SortedSet:

class User {
  ...
  def hasMany = [logins: Login]               
  SortedSet logins

  static fetchMode = [logins: "eager"]
}

8

在Grails/GORM中处理默认排序顺序似乎在Grails 1.1中得到了极大的简化:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接