Archiv für September, 2006
Habe heute meine Diplomarbeit präsentiert.
D.h. dieses Blog wird ab sofort nicht mehr das Überthema der Arbeit haben, sondern zu meinem privaten und Entwicklerblog umfunktioniert.
Für die die es interessiert: Die Diplomarbeit ist sehr gut angekommen und ich hoffe, dass die Note das auch wiederspiegeln wird :-D.
Heute morgen hat dieses Blog die 1000-Hit-Marke geknackt.
Und gestern war sogar der Tag mit den meisten Besuchen bisher.
Nicht schlecht nach gerade einmal zwei Monaten und für die exotischen Themen, die hier behandelt werden!
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.