8

Grailsでソートされた関連付けを宣言する方法は2つあるようです。

デフォルトのソート順を使用する方法1ここを参照)

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

SortedSetを使用する方法2ここを参照)

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

どちらを使用するか、また、一方を他方に対して使用することの長所と短所(ある場合)の違いは何ですか。

ご不明な点がございましたら、お気軽にお問い合わせください。

ありがとうございました

4

1 に答える 1

7

私はこれがどのように機能するかを掘り下げ始め、その後、方法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]

最終的に修正された場合、2つの方法の違いは、方法1では、ソートがデータベースレベルで行われることです。上記の例外でわかるように、GORMは、book.titleフィールドのデータベースインデックスを使用してオブジェクトをその順序で返す「books0_.titleによる順序付け」を実行しようとしていました。

2番目のメソッドは、オブジェクトがセットに挿入されたときにメモリ内のオブジェクトを並べ替えます(定義されたcompareToメソッドを使用)。

Until the current bug is fixed, I'd use method 2 because it's the only thing that works. It should be fine for relatively small collections of things. After it's fixed, I'd potentially prefer method 1 as the database should be quicker at doing the sorting with an index on the sort field.

于 2010-05-15T18:13:19.040 に答える