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.QueryBuilder
Importieren der Builderklasse
QueryBuilder query = new QueryBuilder()
Erzeugen des Objekts
query.domain = jobs
Wenn 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 Vieweraufruf
view filename:'query1.tpl',
     bindings: [
        taglib:taglib,
        list:{Closure closure->
           jobs.eachDomain(criteria:{equalOr(jobID:'PU_MAN',minSalary:20000)}){domJob->
              closure.call(domJob)
              }
           }
        ]