GORM Where 查询组合 return 值

GORM Where query composition on return value

我注意到一些我不太理解的行为。只要前面的 where 查询不是从函数返回的,就可以链接 where 查询。

def w = Subscription.where { topicId == 1 }
w.where { user.id == 1 }.findAll()

//works as expected


def f() {
    Subscription.where { topicId == 1 }
}
f().where { user.id == 1 }.findAll()

//doesn't filter by user.id


def f() {
    Subscription.where { topicId == 1 }
}
f().build { eq 'user.id', 1L }

//works

我不介意使用 DetachedCriteria#build()。我只是想了解 :-D

--- 编辑

Grails 2.4.2

Grails 包含全局 AST 转换...

that transforms where methods into detached criteria queries.

它本质上是寻找 where() 的用途并更改代码,以便它使用分离的条件。最有可能的是,在方法的 return 上按原样调用 where(),特别是 returns Object 的方法未被 AST 确认,因此查询基本上最终保持不变,什么也不做。

这不是 Groovy 正在做的事情,而是 Grails 特有的事情。我并没有声称对正在发生的事情有完整的理解,也没有接近完整的理解,但是您可以通过查看 DetachedCriteriaTransformer 源代码来了解它的要点。