Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在grails域类中声明排序关联的最佳方法是什么?_Grails_Gorm_Grails Domain Class - Fatal编程技术网

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

在grails域类中声明排序关联的最佳方法是什么?,grails,gorm,grails-domain-class,Grails,Gorm,Grails Domain Class,在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 comp

在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]
}
类书实现了可比较的{
字符串标题
国际比较组织(obj){
头衔
}
}
类作者{
分类集书籍
静态hasMany=[书籍:书籍]
}
我不确定使用哪一个,以及使用一个与另一个之间的区别(如果有),利弊

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


谢谢

我开始深入研究这一切是如何工作的,然后发现方法1实际上在当前版本的grails中被破坏了(在1.2.1和1.3中都进行了测试)。当您实际尝试检索作者并查看其书籍时,它会抛出一个异常

它()有一个公开的缺陷,已经公开了很长一段时间

下面是引发的异常:

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试图执行“order by books0_uu0.title”,它将使用book.title字段上的任何数据库索引,并按该顺序返回对象

第二种方法是在将对象插入集合时对内存中的对象进行排序(使用定义的compareTo方法)


在修复当前错误之前,我会使用方法2,因为它是唯一有效的方法。对于相对较小的事物集合,它应该是好的。修复后,我可能更喜欢方法1,因为数据库在排序字段上使用索引进行排序时应该更快。

正是我所需要的!非常感谢。我也在使用方法2,但在阅读Grails-1.2发行说明时,我发现了方法1,并且我还假设排序是在DB级别完成的,这比SortedSet要好一些。我会像你一样:等待这个错误被修复,一旦完成就切换。一个问题:在方法1中,如果声明为is,books是一个实例操作系统集,对吗?是的,您将拥有books作为一个集。Set是grails集合的默认值,它们通常不会被排序(因此它们是HashSet)。如果你想让它们成为一个列表,你必须明确地声明它。虽然链接的jira标记为“不会修复”,但最重要的是“使与
Book{…static belongsTo=[author:author]}
”的关系双向,如果它对你有帮助,请找到我的答案: