Подтвердить что ты не робот

Определение порядка сортировки по умолчанию в Grails/GORM

Скажем, я определил объект User, используя GORM. У каждого пользователя может быть ноль или более Логин: 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, который является последним стабильным выпуском.

4b9b3361

Ответ 1

Обработка порядка сортировки по умолчанию в Grails/GORM, по-видимому, была радикально упрощена в Grails 1.1:

Ответ 2

Они показывают, как это сделать на странице 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'
    }
}

Ответ 3

Просто создайте класс входа в интерфейс 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"]
}