【问题标题】:What is the best way to declare sorted association in grails domain classes?在 grails 域类中声明排序关联的最佳方法是什么?
【发布时间】:2010-05-15 13:57:55
【问题描述】:

在 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]
}

我不确定要使用哪一个,以及使用其中一个和另一个之间有什么区别(如果有的话)、利弊。

如有任何澄清,我将不胜感激。

谢谢

【问题讨论】:

标签: grails grails-orm grails-domain-class


【解决方案1】:

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

【讨论】:

  • 正是我需要的!谢谢!我也在使用方法 2,但是在查看 Grails-1.2 发行说明时,我发现了方法 1,并且我还假设排序是在 DB 级别完成的,这比 SortedSet 好一些。我会像你一样:等待这个错误被修复并在完成后切换。一个问题:在方法1中,如果按原样声明,books是一个实例os 设置对吗?
  • 是的,您将拥有一套图书。 Set 是 grails 集合的默认值,它们只是通常不排序(因此它们是 HashSet)。如果您希望它们成为列表,则必须明确声明它。
  • 虽然链接的jira被标记为“Won't Fix”,但workaround是为了“与Book { ... static belongsTo = [author: Author] }建立双向关系。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2021-06-10
  • 2011-12-01
相关资源
最近更新 更多