Каков наилучший способ объявить отсортированную ассоциацию в классах домена grails? - PullRequest
8 голосов
/ 15 мая 2010

Кажется, что есть два разных способа объявления отсортированных ассоциаций в Grails:

Метод 1 (см. здесь ) с использованием порядка сортировки по умолчанию

class Book {
  String title 
}
class Author {
  static hasMany = [books : Book]
  static mapping = { books sort: "title"}
}

Метод 2 (см. здесь ) с использованием SortedSet

class Book implements Comparable {
  String title
  int compareTo(obj) {
    title <=> obj.title
  }
}
class Author {
  SortedSet books
  static hasMany = [books : Book]
}

Я не уверен, какой из них использовать и в чем разница (если есть), плюсы и минусы между использованием одного против другого.

Буду признателен за любые разъяснения.

Спасибо

1 Ответ

6 голосов
/ 15 мая 2010

Я начал копаться в том, как все это работает, а затем обнаружил, что метод 1 действительно отключен в текущих версиях грааля (протестировано в 1.2.1 и 1.3). Когда вы на самом деле пытаетесь найти автора и посмотреть на его книги, выдается исключение

Для него существует открытый дефект ( 4089 ), который уже давно открыт.

Вот исключение, которое выдается:

ERROR util.JDBCExceptionReporter  - Column not found: BOOKS0_.TITLE in statement [select books0_.author_books_id as author1_0_, books0_.book_id as book2_0_ from author_book books0_ where books0_.author_books_id=? order by books0_.title]

Если и когда они наконец исправят это, различия между этими двумя методами заключаются в том, что в первом методе сортировка выполняется на уровне базы данных. Как вы можете видеть в исключении выше, GORM пытался выполнить «заказ по books0_.title», который использовал бы любой индекс базы данных в поле book.title и возвращал объекты в этом порядке.

Второй метод сортирует объекты в памяти в тот момент, когда они вставляются в набор (используя определенный метод CompareTo).

Пока текущая ошибка не будет исправлена, я бы использовал метод 2, потому что это единственное, что работает. Это должно быть хорошо для относительно небольших коллекций вещей. После исправления я бы предпочел метод 1, поскольку база данных должна быстрее выполнять сортировку с индексом в поле сортировки.

...