Hibernate Criteria API für optionale SQL Query Parameter

Wenn man Suchformulare hat, bei denen alle oder viele Suchparameter optional sind, hat man immer das Problem, wie man die SQL Abfragen dafür gestalltet.

Man könnte entweder für jede Kombination eine eigene Query schreiben oder eine Query von Hand mit unzähligen ifs zusammenschustern.

Ein solches Vorgehen ist jedoch sehr fehleranfällig, weil sich so leicht Fehler in die SQL Query, die am Ende herauskommt, einschleichen.

Hibernate bietet auch hier eine elegante Lösung an: die Criteria API. Hiermit lassen sich Querys auf einfache Art und Weise zusammenbauen, mit allem was dazugehört (Joins usw.). Um die eigentliche Generierung des SELECT Statements kümmert sich das erprobte Framework.

Solch ein Criteria Objekt ist eigentlich nichts anderes als eine leere Hibernate Query, an die man Suchkriteren anhängen kann.

//Das Criteria Object erzeugen
Criteria purchaserCriteria = hibSession.createCriteria(Einkaeufers.class);

//Normales Kriterium
if (einkaeuferName != null)
{
purchaserCriteria.add(Expression.like(„einkaeuferName“, einkaeuferName);
}

Expression.like() gibt ein Criterion zurück, dass für die add-Methode des Criteria Objektes benötigt wird. Expression hat für alle Standard-SQL Operatoren statische Methoden, wie eq (=), le (<=), gt (>) usw.

Für Joins wird einfach ein weiteres Criteria Objekt erzeugt, um dafür wiederum eine Expression angeben zu können.
Der erste Parameter der createCriteria() Methode ist der Name des Properties in der hbm-Datei (funktionenSet), der zweite ein frei wählbarer Alias, den man im Criterion nutzen kann (funktionen.funtkionId).

//Kriterium mit einem Join
if (functionId > 0)
{
purchaserCriteria.createCriteria(„funktionenSet“, „funktionen“)
.add(Expression.eq(„funktionen.funktionId“, new Integer(functionId)));
}

//Kriterium mit zwei Joins
if (countryId > 0)
{
purchaserCriteria.createCriteria(„standort“, „standort“).createCriteria(„laender“, „laender“).add(Expression.eq(„laender.laenderId“, new Integer(countryId)));
}

ResultTransformer können ebenfalls praktisch sein (hier DISTINCT):

//Ergebnis muss Distinct sein
purchaserCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Sortierung ist natürlich auch möglich:

//Order hinzufügen (über einen Join mit Alias (hier wird kein extra Criteria Object erzeugt))
purchaserCriteria.createAlias(„tEinkaeufer“, „tEinkaeufer“).addOrder(Order.asc(„tEinkaeufer.telvName“));

Wenn alle Suchparameter angegeben sind, kann wie bei der Query API list() ausgeführt werden.

//Abfrage ausführen
List purchaserList = purchaserCriteria.list();

Alles in allem lässt sich sagen, dass man sich mit dieser API sehr viel Arbeit und Ärger ersparen kann.

Wieder ein Grund mehr für die Verwendung von Hibernate!

Eine sehr gute Einführung in die API gibt es bei devx.

Advertisements



    Kommentar verfassen

    Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

    WordPress.com-Logo

    Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

    Twitter-Bild

    Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

    Facebook-Foto

    Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

    Google+ Foto

    Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

    Verbinde mit %s



%d Bloggern gefällt das: