我注意到一些我不太了解的行为。只要前面的查询没有从函数中返回,就可以将查询链接到哪里。
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
答案 0 :(得分:0)
Grails包含全局AST转换......
将方法转换为分离条件查询。
它主要查找where()
的用法并更改代码,以便它使用分离的标准。最有可能的是,在返回一个方法,特别是一个返回where()
的方法时,调用Object
并不会被AST确认,因此查询基本上不会更改并且正在执行什么都没有。
这不是Groovy所做的,而是Grails特有的。我并没有声称完整,也没有任何接近完整,理解发生了什么,但你可以通过查看DetachedCriteriaTransformer源代码来获得它的要点。