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