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

标签 grails grails-orm grails-domain-class

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

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

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

方法二 (参见 here )使用 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,因为数据库应该更快地使用排序字段上的索引进行排序。

关于grails - 在 grails 域类中声明排序关联的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2840364/

相关文章:

Grails 域实例未保存

grails - Grails GORM在Grails控制台中引发错误

grails - Grails hbm2ddl.SchemaUpdate错误失败

authentication - Grails 3 中的 Jetty 容器身份验证

select - 如何在Grails中自定义选择标签

grails - 无法从 Grails 中的服务执行保存操作

grails - 来自一对多 Grails 域的查询返回的格式错误的对象

grails - 在Grails 3.x中使用JPA注释进行映射

rest - 一对多关系

jquery - 根据 grails 中所选项目自动填充文本字段