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

Posted

技术标签:

【中文标题】在 Grails/GORM 中定义默认排序顺序【英文标题】:Defining default sort-order in Grails/GORM 【发布时间】:2010-10-05 22:22:42 【问题描述】:

假设我使用 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,这是最新的稳定版本。

【问题讨论】:

【参考方案1】:

他们在参考指南的 GORM 页面上展示了如何执行此操作(第 5 节)。您想要的位在该文档的底部附近是您想要的部分。他们有两个简单的例子:

class Airport 
    …
    static mapping = 
        sort "name"
    


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

他们还有一个对关联进行排序的示例:

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

【讨论】:

如果你想下降关联:flights sort:'number', order: 'desc'(每grails.1312388.n4.nabble.com/…) 如何对多个属性进行排序? @ricardogobbo 可能有点晚了,但请继续:static mapping = sort([column1: 'asc', column2: 'asc']) 【参考方案2】:

只需让登录类实现 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"]

【讨论】:

【参考方案3】:

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

Grails 1.1 release notes(搜索“默认排序顺序”)

【讨论】:

以上是关于在 Grails/GORM 中定义默认排序顺序的主要内容,如果未能解决你的问题,请参考以下文章

Grails + GORM:GORM 中默认的 equals() 实现是啥?

Grails:将自定义约束应用于域类的所有字段

在 Grails (GORM) 中处理并发修改,同时避免过时对象异常

在 Wordpress 中,如何将自定义帖子类型的默认管理员排序顺序设置为自定义列?

独立使用 Grails GORM

如何覆盖 Grails GORM 中关系的级联删除?