Grails为什么不建议对非单端关联使用联接获取?

Grails为什么不建议对非单端关联使用联接获取?,grails,join,fetch,Grails,Join,Fetch,我在grails文档中看到了一些关于join fetch的内容: “这对于单端关联很有效,但您需要 小心一对多的查询。查询会像你期望的那样工作 直到您为想要的结果数量添加限制的那一刻。在 在这一点上,你可能会得到比以前更少的结果 期待。原因是技术性的,但最终 问题源于使用左外连接的GORM。” 我不明白为什么左外部联接会在非单端关联(例如一对多)中引发问题。 你能给我举个例子吗 如果我以约书亚为例 Class Person { String name static hasMany

我在grails文档中看到了一些关于join fetch的内容:

“这对于单端关联很有效,但您需要 小心一对多的查询。查询会像你期望的那样工作 直到您为想要的结果数量添加限制的那一刻。在 在这一点上,你可能会得到比以前更少的结果 期待。原因是技术性的,但最终 问题源于使用左外连接的GORM。”

我不明白为什么左外部联接会在非单端关联(例如一对多)中引发问题。

你能给我举个例子吗

如果我以约书亚为例

Class Person {
    String name
    static hasMany = [numbers:PhoneNumber]
    static mapping = {
        nubmers fetch  : 'join'
    }
}

Class PhoneNumber{
     static belongsTo = [owner : Person]
}

//for testing
def person = Person.get(1)
result in: 
select name,... from 
       person left outer join phone_number 
       on person.id = phone_number.owner_id 
       where person.id=1;
你能给我一个问题的答案吗


谢谢

如果我正确理解了你的问题,那么就用一个简单的例子来解释吧。假设我们有一个域类Person,它有许多与之关联的PhoneNumber类。因此,获取此数据的左连接将产生如下SQL结果:

PersonId, Name, PhoneNumberId, TelNumber
-----------------------------------------
1, Joe, 1, 123-123-1234
1, Joe, 2, 222-222-2222
1, Joe, 3, 333-333-3333
2, Jane, 4, 000-000-000
这将是从数据源返回的四条记录,但只有两个Person域实例及其关联的电话号码。但是,如果您将此查询限制为最多2条记录,那么实际上您将只获得Person域的一个实例(本例中为Joe)和他的前两个电话号码

希望这有助于您理解根本问题

另外,这是一个完全理论化的示例,由于Hibernate的原因,来自GORM的实际查询结果将具有不同的列名

更新

基于GORM的查询示例非常简单:

def people = Person.list([max: 2])

您可能希望上面给出两个person实例,但实际上,由于左连接,您将只得到一个实例。打开SQL日志将向您显示正在执行的实际查询,您会注意到它使用的是左连接。

我现在已经理解了问题:)但我认为只返回一个结果(如get、findBy等)的方法没有问题。谢谢:)