2017-10-17 2 views
0

Ich versuche, diesen oberen Block des Codes aus wie der untere Block des Codes aus.Wie erstellt man eine benutzerdefinierte Funktion, die eine Schließung der Grails-Kriterien Methoden

if (params.xId) { 
    and { 
     'in'(aggregateClassReference, hierarchy['x']) 
     eq(aggregateIdReference, params.xId as Long) 
    } 
} 
if (params.yId) { 
    and { 
     'in'(aggregateReference, hierarchy['y']) 
     eq(aggregateIdReference, params.yId as Long) 
    } 
} 

...

if (params.xId) { belongsToHierarchy('x', params.xId as Long) } 
if (params.yId) { belongsToHierarchy('y', params.yId as Long) } 

Ich verwende Abfragen gorm Kriterien, aber ich will nicht, diese großen Brocken von Code. Gibt es eine Möglichkeit, eine Schließung dieser Kriterienabfragen in einer benutzerdefinierten Funktion zurückzugeben? Das Problem ist im Moment habe ich die folgenden Stücke von Code in

setzen
def criteria = DetachedCriteria.build(...) 

Danach habe ich ein

criteria.list(...) 

auszuführen. Es wäre toll, irgendwie eine Schließung nur die Rückkehr

and { 
    'in'{...} 
    eq {...} 
} 

in einer benutzerdefinierten Funktion im Build, aber ich habe nicht in der Lage gewesen, dass noch herauszufinden. Ein bisschen neu für das Gral. Jeder Einblick, um mich zu führen, wäre sehr geschätzt :)

+1

Vielleicht benannte Abfragen helfen könnten? Hast du in sie hineingeschaut? http://docs.grails.org/latest/ref/Domain%20Classes/namedQueries.html –

Antwort

1

Es gibt eine Reihe von Möglichkeiten, dies zu tun. Du hast nicht genug Kontext gezeigt, um genau zu sehen, welche Lösung du am besten machst, aber wenn du was gibst, kann ich etwas zeigen, das helfen könnte.

Wenn Sie Fragen Kriterien verwenden, dann anstelle von etwas wie dies wollte ...

def results = SomeDomainClass.withCriteria { 
    if (params.xId) { 
     and { 
      'in'(aggregateClassReference, hierarchy['x']) 
      eq(aggregateIdReference, params.xId as Long) 
     } 
    } 
    if (params.yId) { 
     and { 
      'in'(aggregateReference, hierarchy['y']) 
      eq(aggregateIdReference, params.yId as Long) 
     } 
    } 
} 

Man könnte so etwas tun ...

def results = SomeDomainClass.withCriteria { 
    if (params.xId) { 
     belongsToHierarchy 'x', params.long('xId'), delegate 
    } 
    if (params.yId) { 
     belongsToHierarchy 'y', params.long('yId'), delegate 
    } 
} 

// ... 

// it isn't clear from your example if 
// aggregateClassReference and hierarchy are local 
// variables in the context where the criteria 
// query is being initialized or if they are 
// instance variables. If they are instance variables 
// the code below will work. If they are local 
// variables then they might need to be passed as 
// arguments into this belongsToHierarchy method... 

void belongsToHierarchy(String arg, long id, delegate) { 
    def query = { 
     // not sure why you had the "and" in your example, but 
     // I will leave it here assuming there is a reason... 
     and { 
      'in' aggregateClassReference, hierarchy[arg] 
      eq aggregateIdReference, id 
     } 
    } 
    query.delegate = delegate 
    query() 
} 
+0

Ich zeigte eine Kriterienabfrage, weil das ist, was Sie in Ihrer Frage verwendet haben. Abhängig von einigen Details, die in der Frage nicht klar sind, könnte eine andere Option mit einigen netten Vorteilen darin bestehen, die Tatsache auszunutzen, dass abgetrennte Kriterienabfragen zusammensetzbar sind. –

Verwandte Themen