在grails域类中声明排序关联的最佳方法是什么?

时间:2010-05-15 13:57:56

标签: grails gorm grails-domain-class

似乎在Grails中有两种不同的方式来声明排序关联

方法1 (请参阅here)使用默认排序顺序

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

方法2 (请参阅here)使用SortedSet

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

我不确定使用哪一个,有什么不同(如果有的话),使用一个与另一个之间的利弊。

我将不胜感激任何澄清。

谢谢

1 个答案:

答案 0 :(得分:6)

我开始深入研究这一切是如何工作的,然后发现方法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,因为数据库应该更快地使用排序字段上的索引进行排序。