Кажется, что существует два различных способа объявить отсортированные ассоциации в 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 фактически не работает в текущих версиях grails (проверенных как в 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, поскольку база данных должна быстрее выполнять сортировку с индексом в поле сортировки.