16

假设我使用 GORM 定义了一个用户对象。每个用户可以有零个或多个 Login:s。每个登录都有一个时间戳。检索 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,它是最新的稳定版本。

4

3 回答 3

28

他们在参考指南(第 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'
    }
}
于 2009-05-27T22:31:16.237 回答
14

只需让 Login 类实现 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"]
}
于 2009-02-06T13:42:48.683 回答
8

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

于 2009-03-10T18:23:16.777 回答