Inhalt
eachDoamin mit Kriterien
Um bei mengenorientierte Datenbankabfragen bei den Kriterien die Domainfelder verwenden zu können wird ein Builder eingesetzt.Beispiel:
jobs.eachDomain(criteria:{greaterequals(minSalary:8000)}){domJob-> closure.call(domJob) }
Operatoren
- Vergleichs Operatoren
- equal
- notequal
- greater
- greaterequals
- less
- lessequals
- like
- notlike
- in
- Logische Opertoren
- and
- or
- not
Kriterien Builder
Im Grunde wird der Kriterienbuilder wie ein Closure aufgebaut. Die Kriterien werden als Funktoionsaufrufe notiert.Ein Vergleichsoperator hat als Parameter eine Map, welche aus dem Domainfeldnamen und den Vergleichwert besteht.
equal(jobID:'PU_MAN')Sollen mehere Felder mit 'AND' verknüpft werden so können diese in der Map gelistet werden.
equal(jobID:'PU_MAN',minSalary:8000)Dies wird zu
"OB_ID = 'PU_MAN' AND MIN_SALARY = 8000"konvertiert. Sollen die Begriffe mit einem OR vernküpft werden kann an den Operator der Kennzeichner "Or" angefügt werden.
equalOr(jobID:'PU_MAN',minSalary:20000)
Diese Anweisung ergibt "JOB_ID = 'PU_MAN' OR MIN_SALARY = 20000".Die gleiche Funktionalität kann mit der Erweitrung 'And' durchgführt werden.
Um logische Verknüpfungen zu ermöglichen sind die Anweisungen 'and' und 'or' vorhanden.
Aufbau einer Abfrage
Wir gehen davon aus, dass ein Kriterienbuilder erzeugt wurde:import framework.database.DAO.helper.QueryBuilderImportieren der Builderklasse
QueryBuilder query = new QueryBuilder()Erzeugen des Objekts
query.domain = jobsWenn der Builder ausserhalb von eachDoamin muss eine Domain übergeben werden.
Beispiel
Es kann die Query aufgebaut werden:query { equal(x:23) }Die where Klauses kann durch den Befehl
println query.getWhere()gewonnen werden. Ergebnis: x = 23
Das Folgende Beispiel zeigt die Verwendung von "or"
query { equal(a:23) or { greater(b:2) equal(c:3) } }Ergibt: a = 23 OR (b > 2 AND c = 3 ). "or" Anweisungen werden geklammert.
or/and Anweisungen können tief geschachtelt werden:
query { equal(a:23) or { greater(b:2) equal(c:3) and { equalOr(c:4,d:5) } } }Ergebnis: a = 23 OR (b > 2 AND c = 3 AND (c = 4 OR d = 5 ))
Eine weitere Möglichkeit ist die Verwendung des logischen Operators "not".
query { equal(a:23) not { lessequals(e:6) } }Das Ergbnis lautet: a = 23 NOT (e <= 6 )
Die Verwendung von LIKE und NOT LIKE
query { like(a:"'a%'",b:"'b%'") notlike(c:"'c%'") }Ergibt: a LIKE 'a%' AND b LIKE 'b%' AND c NOT LIKE 'c%'
Verbindung mit view
Das Beispiel zeigt die Verwendung von in einem Vieweraufrufview filename:'query1.tpl',
bindings: [
taglib:taglib,
list:{Closure closure->
jobs.eachDomain(criteria:{equalOr(jobID:'PU_MAN',minSalary:20000)}){domJob->
closure.call(domJob)
}
}
]