Grails为什么不建议连接提取无单端关联?

Gre*_*ydp 4 grails join fetch

我在grails doc中看到了一些关于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;
Run Code Online (Sandbox Code Playgroud)

你能给我一个查询(在gorm中)可以告诉我这个问题吗?

谢谢

Jos*_*ore 5

如果我正确理解你的问题,那么用一个简单的例子来解释是最容易的.假设我们有一个域类Person,其中包含许多与之关联的PhoneNumber类.因此,获取此数据的LEFT JOIN将导致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
Run Code Online (Sandbox Code Playgroud)

这将是从数据源返回的四个记录,但只有两个Person域的实例及其关联的电话号码.但是,如果将此查询限制为最多2个记录,则实际上只会获得Person域的一个实例(本例中为Joe)和前两个电话号码.

希望能帮助您了解潜在的问题.

PS这是一个完全理论上的例子,GORM的实际查询结果会有不同的列名,因为Hibernate.

更新

基于GORM的示例查询很容易演示:

def people = Person.list([max: 2])
Run Code Online (Sandbox Code Playgroud)

您可能希望上面的内容为您提供两个实例,但实际上由于左连接,您最终只会得到一个实例.打开SQL日志记录将显示正在执行的实际查询,您将注意到它正在使用LEFT连接.