Java EE 7: Geschäftsanwendungen

Benannte Abfragen definieren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die besten Statements nützen nichts, wenn dabei die Wartbarkeit der Applikationen leidet. Dieses Video zeigt die Definition von benannten Abfragen und setzt das auf Ebene der Datenschicht um.

Transkript

Der beste Data-Layer nutzt uns gar nichts, wenn er nicht Wartbar ist. Ein ganz wesentlicher Aspekt für Wartbarkeit ist die Verwendung von benannten Abfragen. In diesem Video werden wir uns deshalb damit auseinandersetzen, wie wir benannte Abfragen definieren können, welche Arten von benannten Abfragen es überhaupt gibt und wir werden unseren Data-Layer so anpassen, dass er statt einer eingebetteten Abfrage, eine benannte Abfrage verwendet. Benannte Abfragen in der JPQL sind eigentlich ganz normale Abfragen. Nun werden diese halt benannt und werden dann üben den symbolischen Namen angesprochen, statt, dass man im Code direkt immer den eigentlichen Abfrageausdruck verwendet. Wir reichen dies, indem wir die Abfrage auf Ebene einer Entität mit Hilfe der @NamedQuery oder @NamedQueries-Annotationen definieren. @NamedQuery definiert dabei eine benannte Abfrage, und möchte ich auf der Entität mehrere benannte Abfragen definieren, dann kapsele ich das innerhalb einer @NamedQueries-Annotation. Die eigentliche Abfrage wird dann ausgeführt, mit Hilfe der Methode "createNamedQuery()" des EntityManagers und da übergebe ich dann als Parameter, den Namen der Abfrage. Wir können ebenfalls native, also SQL-Abfragen ausführen. Bei diesen SQL-Abfragen ist es möglich, dass wir ebenfalls die O/R-Mapping Funktionalitäten der JPA nutzen können, das bedeutet, dass wir die Ergebnisse direkt wieder in Form von Entitäten bekommen. Und uns dann selber nicht darum kümmern müssen, wie wir aus der Rückgabe, dann auf bestimmte Felder zugreifen. Derartige Abfragen können ebenfalls benannt sein, das werden wir dann erreichen, indem wir sie auf Ebene von Entitäten, mit Hilfe von @NativeQuery,beziehungsweise @NativeQueries-Annotation notieren. Hier gilt wieder dasselbe wie bei @NamedQuery und @NamedQueries. Eine einzelne native Abfrage wird per @NativeQuery definiert und mehrere native Abfragen, dann per @NativeQueries. Wenn ich, dann es Ganze ausführen möchte, verwende ich die Methode "createNativeQuery()" der EntityManager Instanz. Dieser kann ich, dann das eigentliche SQL Statement direkt übergeben. Möchte ich ein benanntes SQL Statement ausführen, verwende ich die gleiche Methode, wie für ein benanntes JPQL Statement, nämlich "createNamedQuery()". Ebenfalls haben wir eine Unterstützung von Stored Procedures. Seit JPA 2.1, also seit der aktuellen Version, ist dies möglich. Zum einen gibt es die Methoden createStoredProcedureQuery() der EntityManger Instanz, hier kann ich direkt die Stored Procedures Abfrage übergeben. Möchte ich eine Stored Procedure Abfrage benannt machen, dann verwende ich die Methode "createNamedStoredProcedureQuery" und übergebe hier den Namen, der benannten Stored Procedure Abfrage. Optional kann ich, dann Parameter setzen, und das Ergebnis rufe ich mir ab über getOutputParameterValue. Darüber gebe ich den Index der Rückgabe, so eine Stored Procedure kann ja mehrere Rückgaben haben und kann, dann eben den entsprechenden Wert abrufen. Nun werden wir uns, damit auseinandersetzten, wie wir in unserem Data-Layer eine bisher inline existierende Abfrage in eine @NamedQuery überführen können. In unserer CustomerBean befindet sich in der Methode getAllCustomers eine bisher nicht benannte Abfrage. Diese bisher nicht benannte Abfrage wollen wir nun umwandeln in eine @NamedQuery. Zu diesem Zweck kopiere sie einfach aus dem Code heraus, ich nehme auch in Kauf, dass der jetzt gerade Fehler wirft, und definiere dann die Abfrage mit Hilfe der @NamedQuery-Annotation, auf Ebene der CustomerEntität. So eine NamedQuery besitzt immer einen Namen und ein Query Attribut und dieses Query Atribut nimmt die eigentliche Abfrage auf. Bevor ich nun die @NamedQuery in der CustomerBean direkt verwende, werde ich für den Namen noch eine Konstante definieren. Das erleichtert es mir, diese Query auch korrekt anzusprechen, denn so umgehe ich das Problem, dass ich eventuell irgendwelche Buchstabendreher oder ähnliche Sachen definieren könnte bei der Abfrage. Deswegen definiere ich jetzt hier eine "public static final" Variable, von Typ String, mit dem Namen QUERY_GETALL und die benenne ich auch so eindeutig wie möglich und nun referenziere ich sie hier bei dem NameAttribut und dann kann ich diesen konstanten Wert ebenfalls in der Bean referenzieren. Hier in dieser Bean ersetzte ich nun createQuery() durch createNamedQuery() und übergebe als ersten Parameter, den Namen der Abfrage, den haben wir ja gerade als konstanten Wert definiert, und als zweiten Parameter sagen wir, welchen Datentyp wir in der Rückgabe erwarten. Damit haben wir unsere benannte Abfrage fertig implementiert und haben nun den Vorteil, dass wir diese Abfrage an einer zentralen Stelle, nämlich beim Customer haben und dass wir uns eben nicht irgendwie vertun können, beim Ansprechen dieser Abfrage. Sollten wir also nochmal an andere Stelle so eine Abfrage definieren, dann ist es zukünftig sehr einfach möglich, indem wir eben den konstanten Wert hier referenzieren mit der createNamedQuery() Anweisung. In diesem Video haben wir uns damit auseinandergesetzt, wie wir unsere Abfragen organisieren können. Wir haben über NamedQueries gesprochen über NamedSQLQueries und über NamedStoredProcedures und wir haben darüber gesprochen und uns angeschaut, wie wir das Ganze dann auch umsetzten können in unserer CustomerBean und auf Ebene der CustomerEntität.

Java EE 7: Geschäftsanwendungen

Verfolgen Sie, wie eine komplette Business-Applikation unter dem Einsatz des gesamten Java-Enterprise-Techologiestacks ensteht.

5 Std. 2 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!