DB-Zugriff nur mit Criteria

In vielen Anwendungen existiert bereits ein Wrapper, welcher den Datenbankzugriff erleichtert. Ebenfalls viele nutzen dan im Hintergrund JPA und Hibernate.

Allerdings ist man in diesem Fall auf genau die vorgegebene Struktur angewiesen und kann keine Änderungen vornehmen, falls die DB-Anfrage nicht wie gewünscht erfolgt ist.

Bei SpringBoot kann man z.B. mit der Specification einen Filter angeben, welcher dann bei der DB-Anfrage verwendet wird. Darunter passieren viele Sachen, die man dann aber nur in den Logs von SpringBoot nachvollziehen  kann.

Um die Anfragen an die Datenbank unter der eigenen Kontrolle zu haben, war der Ansatz einen eigenen Wrapper zu schreiben, welcher ähnlich wie die Specification von Spring funktioniert.

Folgende Struktur ist daraus entstanden:

  • CriteriaWrapper (mit der Anfrage-Klasse  und der EntityManager)
  • AbstractRepository (mit eigenen Anfragen mittels Criteria)
  • FilterData (mit Methoden die jeder Filter enthalten muss bzw. benutzen kann)

Der CriteriaWrapper wird hauptsächlich zum Zusammenbauen und Verarbeiten der SQL-Query verwendet.
Das Zusammenbauen der Query wird durch die FilterData unterstützt, welche zusätzliche Predikate liefert, die dann mit in die Query einfließen.
Das AbstractRepository bietet hingegen direkte Methoden über den EntityManager z.B. Update, Delete und weitere Methoden, die direkt über den EntityManager geschehen.

Zusätzlich können zu den FilterData weitere Interfaces hinzugefügt werden:

  • OrderAble
  • PageAble
  • SortAble

Dadurch kann dann wieder die resultierende Query mit „sortBy“, „orderBy“ und „limit x, x“ angereichert werden.

Criteria an sich bieten noch den CriteriaBuilder und die CriteriaQuery.
Beide zusammen bieten so gut wie alle möglichen Befehle, die auch in einer Workbench oder auch per Skript auf einer Datenbank ausgeführt werden können.

Folgende Möglichkeit bietet nun eine eigene Implementierung des Zugriffs mit Hilfe der Criteria-Api:

  • Sortierung, Filterung, Paginierung steuerbar
  • Fehlerhafte Anfragen können im Code nachvollzogen werden und dadurch einfacher behoben werden
  • einfache Erweiterung auch für komplexe Abfragen und Joins
  • komplexe Anfragen können durch komplett generische Klassen auch in anderen Projekten wiederverwendet werden

Beispiele und Hinweise

Beispiele

Ein einfaches Beispiel ist das Zählen der Einträge, welche zu dem verwendeten Filter passen. Hierzu muss man zwingend den selben Filter anwenden, wie bei der eigentlich Abfrage der Daten.

Die Variable criteriaData ist hierbei der bereits oben im Beitrag erwähnte CriteriaWrapper.

Das zweite Beispiel ist ein exemplarischer Filter, welcher für die Abfrage mit Criteria verwendet werden kann.

Hinweise

Hinweis: Um die volle Funktionalität mit mysql zu gewährleisten, kann es notwendig sein, folgenden Eintrag in die mysql.cnf zu schreiben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.