2016-04-29 12 views
1

Ich bemerkte etwas Verhalten, das ich nicht ganz verstehe. Es ist möglich, Abfragen solange zu verknüpfen, bis die Abfrage von einer Funktion nicht zurückgegeben wurde.GORM Wo Abfragezusammensetzung auf Rückgabewert

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 

Ich habe nichts gegen die Verwendung von DetachedCriteria # build(). Ich möchte nur :-D

--- bearbeiten

Grails 2.4.2

+0

Warum versuchen Sie nicht 'findAllBy()' und createCriteria mit 'alias' zu verwenden? –

+0

@MikelisBaltruks Nun, es gibt kein Problem zu lösen, ich würde nur gerne verstehen, warum Groovy sich so verhält. Auch der obige Code ist nur ein minimales Beispiel. – kvbx

Antwort

0

Grails enthält eine globale AST Transformation ...

das verwandelt, wo Methoden in verstehen getrennte Kriterienabfragen

Es sucht im Wesentlichen nach Verwendungen von where() und ändert den Code, so dass es gelöste Kriterien verwendet. Am wahrscheinlichsten, where() zu rufen, wie Sie sind, auf die Rückkehr einer Methode, insbesondere eine Methode, die Object zurückgibt, wird nicht von der AST, so dass die Abfrage im Grunde unverändert und nichts tun.

Es ist nichts, was Groovy macht, sondern etwas Grails-spezifisches. Ich beanspruche kein vollständiges oder fast vollständiges Verständnis von dem, was passiert, aber Sie können den Kern davon durch Betrachten des DetachedCriteriaTransformer Quellcodes erhalten.

+0

Klingt vernünftig. Vielen Dank! – kvbx

Verwandte Themen