2016-04-29 37 views
1

我注意到了一些我不太明白的行爲。只要前面的查詢不是從函數返回,就可以鏈接查詢。GORM返回值查詢組成

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

爲什麼不嘗試用'findAllBy()'和createCriteria以'alias'? –

+0

@MikelisBaltruks好吧,沒有實際的問題需要解決,我只想了解Groovy爲什麼要這樣做。另外,上面的代碼只是一個簡單的例子。 – kvbx

回答

0

Grails中包含一個全局AST轉換...

這其中轉變成方法分離標準查詢。

它實質上是尋找where()的用法,並更改了代碼,以便它使用分離的標準。很可能,按照原樣調用where(),在返回方法時,特別是返回Object的方法沒有被AST確認,因此查詢基本上最終保持不變並且什麼都不做。

Groovy沒有做什麼,而是Grails特定的東西。我並沒有對所發生的事情提出充分的理解,也沒有接近完整的理解,但您可以通過查看DetachedCriteriaTransformer源代碼獲得它的要點。

+0

聽起來很合理。謝謝! – kvbx