Grails:渴望获得一对一

时间:2015-06-19 16:24:15

标签: grails

在阅读关于GORM Gotchas的同时,我对于渴望获得一对一的态度感到有些困惑。鉴于上述链接:

  

考虑这个问题:

     

print (sku+" "+country+" "+sale_price+" "+Saving())

     

很有可能,这只会返回一个Author实例。那是   可能不是你期望或想要的行为。那么发生了什么?

     

在幕后,Hibernate使用左外连接来获取书籍   为每个作者。这意味着您将获得重复的Author实例:one   对于作者所关联的每本书。如果您没有最大值   那里的选项,你不会看到那些重复,因为GORM删除   他们。但问题是最大选项适用于结果   在删除重复之前。所以在上面的例子中,Hibernate   只返回两个结果,两者都可能具有相同的结果   作者。 GORM然后删除副本,你最终得到一个   作者实例。

上面引用的粗体部分是我的混乱开始的地方。如果它是一个左外连接,我们最终不应该得到每个作者的书籍(只有一个作者的书)而不是书籍不止一个作者(我们没有进入左外连接的集合的交集)?或者这是否意味着Author.list(max: 2, fetch: [ books: 'join' ])查询修饰符可能由多位作者处理书籍。

我不得不做任何澄清。

1 个答案:

答案 0 :(得分:2)

混淆来自于您不了解使用LEFT JOIN来获取书籍列表所执行的SQL。该评论试图指出的是,使用LEFT JOIN MAX会给您带来意想不到的结果。请考虑以下

author
id, name
1, Bob
2, Joe

book
id, name
1, First book
2, Second book
3, Third book
4, Fourth book

author_books
author_id, book_id
1, 1
1, 2
1, 3
2, 4

在获取作者及其书籍关联时,查询使用LEFT JOIN,因此从数据库返回的数据如下所示:

author.id, author.name, book.id, book.name
1, Bob, 1, First book
1, Bob, 2, Second book

这将导致单个作者被退回,但书籍集合将仅包括三本相关书籍中的两本。这是由于MAX限制应用于SQL语句本身并限制返回的最大行数。

指出这一点的原因是因为可能期望您在列表中最多获得两个作者,无论相关图书的数量是多少,而是因为获取由于正在执行的实际SQL,情况并非如此。

希望有所帮助。