EJB-Abfrage verwenden

Mit der EJB-Abfragesprache (Enterprise JavaBeans) kann eine Abfrage zu containergesteuerten Entity-Beans angegeben werden. Die Sprache ist mit SQL (Structured Query Language) vergleichbar. Eine EJB-Abfrage ist unabhängig von der Zuordnung der Bean zu einem persistenten Speicher.

Informationen zu diesem Vorgang

Eine EJB-Abfrage ist in den drei folgenden Situationen möglich:
  • Sie möchten eine Finder-Methode für eine EJB-Entity-Bean definieren.
  • Sie möchten eine Select-Methode für eine EJB-Entity-Bean definieren.
  • Sie möchten eine Abfrage mit der dynamischen API "executeQuery()" dynamisch angeben.
Finder- und Select-Abfragen werden im Implementierungsdeskriptor der Bean mit dem Tag <ejb-ql> angegeben. Sie werden während der Implementierung in SQL kompiliert. Dynamische Abfragen sind im Anwendungscode selbst enthalten.

Die EJB-Abfragesprache des Produkts ist mit der EJB QL, die in den Spezifiktionen EJB 2.1, EJB 3.0 und EJB 3.1 von Sun definiert ist, kompatibel und besitzt zusätzliche Funktionen, die im Artikel "Vergleich der EJB-Spezifikation und der WebSphere-Abfragesprache" aufgelistet sind.

Vorgehensweise

Beispiel: Abfragen mit EJB

Dieser Artikel enthält ein EJB-Beispielschema und eine Reihe von Beispielabfragen.

Tabelle 1. EJB-Schema und Beispielabfragen. EJB-Schema und Beispielabfragen
EJB-Schema Beispielabfrage
Name der Entity-Bean (EJB-Name) DeptEJB (nicht in Abfrage verwendet)
Name des abstrakten Schemas DeptBean
Implementierungsklasse com.acme.hr.deptBean (nicht in Abfrage verwendet)
Persistente Attribute (cmp-Felder)
  • deptno - Integer (Schlüssel)
  • name - String
  • budget - BigDecimal
Beziehungen
  • emps - Eins-zu-viele mit EmpEJB
  • mgr - Viele-zu-eins mit EmpEJB
Tabelle 2. EJB-Schema und Beispielabfragen. EJB-Schema und Beispielabfragen
EJB-Schema Beispielabfrage
Name der Entity-Bean (EJB-Name) EmpEJB (nicht in Abfrage verwendet)
Name des abstrakten Schemas EmpBean
Implementierungsklasse com.acme.hr.empBean (nicht in Abfrage verwendet)
Persistente Attribute (cmp-Felder)
  • empid - Integer (Schlüssel)
  • name - String
  • salary - BigDecimal
  • bonus - BigDecimal
  • hireDate - java.sql.Date
  • birthDate - java.util.Calendar
  • address - com.acme.hr.Address
Beziehungen
  • dept - Many:1 with DeptEJB
  • manages - 1:Many with DeptEJB
address ist ein serialisierbares Objekt, das als cmp-Feld in EmpBean verwendet wird. Die Definition von address lautet wie folgt:
    public class com.acme.hr.Address  extends Object implements Serializable { 
		public String street;
	   public String state;
	   public String city;
		public Integer zip;
      public double distance (String start_location) { ... } ;
      public  String format ( ) { ... } ;
 }
Mit der folgenden Abfrage werden alle Abteilungen (Departments) zurückgegeben:
SELECT OBJECT(d) FROM DeptBean d
Mit der folgenden Abfrage werden die Abteilungen zurückgegeben, deren Name mit der Zeichenfolge "Web" beginnt. Sortieren Sie das Ergebnis nach dem Namen:
SELECT OBJECT(d) FROM DeptBean d WHERE  d.name LIKE  'Web%' ORDER BY d.name
Die Schlüsselwörter SELECT und FROM werden in den Beispielen in Großbuchstaben angezeigt, die Beachtung der Groß-/Kleinschreibung ist jedoch nicht erforderlich. Wenn ein Name, der in einer Abfrage verwendet wird, ein reserviertes Wort ist, muss der Name in Anführungszeichen gesetzt werden, damit er in der Abfrage verwendet werden kann. Eine Liste der reservierten Wörter finden Sie im Artikel EJB-Abfrage: Reservierte Wörter. Bei IDs, die in Anführungszeichen gesetzt sind, muss die Groß-/Kleinschreibung beachtet werden. Dieses Beispiel veranschaulicht, wie ein cmp-Feld, das ein reserviertes Wort ist, verwendet werden soll:
SELECT OBJECT(d) FROM DeptBean d  WHERE  d."select" > 5
Die folgende Abfrage gibt alle von "Bob" verwalteten Mitarbeiter zurück. Dieses Beispiel veranschaulicht, wie mit einem Pfadausdruck in Beziehungen navigiert wird:
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name='Bob'
Eine Abfrage kann einen Parameter enthalten, der sich auf den entsprechenden Wert der Finder- oder Select-Methode bezieht. Abfrageparameter sind nummeriert und beginnen mit 1:
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name= ?1
Diese Abfrage veranschaulicht die Navigation in einer Beziehung mit mehreren Werten und gibt alle Abteilungen zurück, in denen ein Mitarbeiter mit einem Gehalt von 50000 bis 90000 tätig ist:
SELECT OBJECT(d) FROM DeptBean d,  IN (d.emps) AS e
WHERE e.salary BETWEEN 50000 and 90000

In dieser Abfrage ist eine Verknüpfungsoperation enthalten, die jedes Department-Objekt und dessen Gruppe von Mitarbeitern angibt. Wenn eine Abteilung (Department) keine Mitarbeiter hat, erscheint sie nicht im Ergebnis. Hat eine Abteilung mehrere Mitarbeiter mit einem Gehalt von über 50000, erscheint diese Abteilung mehrmals im Ergebnis.

Bei der folgenden Abfrage werden die doppelt angegebenen Abteilungen entfernt:
SELECT DISTINCT OBJECT(d) from DeptBean d,  IN (d.emps) AS e  WHERE e.salary > 50000
Mitarbeiter mit einer Bonuszahlung von mehr 40 % des entsprechenden Gehalts ermitteln:
SELECT OBJECT(e) FROM EmpBean e where e.bonus > 0.40 * e.salary
Abteilungen ermitteln, in denen die Summe aus Gehalt und Bonuszahlungen von Mitarbeitern der Abteilung das Budget der Abteilung übersteigt:
SELECT OBJECT(d) FROM DeptBean d where d.budget < 
( SELECT SUM(e.salary+e.bonus) FROM IN(d.emps) AS e )
Eine Abfrage kann arithmetische DB2-Ausdrücke für Datum und Uhrzeit enthalten, wenn sie java.sql.*-Datentypen als CMP-Felder und DB2 als Datenspeicher verwenden. Alle Mitarbeiter ermitteln, die am 1. Januar 2000 mindestens 20 Jahre für das Unternehmen tätig waren:
SELECT OBJECT(e) FROM EmpBean e where year(  '2000-01-01' - e.hireDate ) >= 20
Wenn als Datenspeicher nicht DB2 verwendet wird oder wenn Sie lieber java.util.Calendar als CMP-Feld verwenden, können Sie den in Millisekunden angegebenen Java-Wert für Abfragen verwenden. Mit der folgenden Abfrage werden alle Mitarbeiter ermittelt, deren Geburtsdatum vor dem 1. Januar 1990 liegt:
SELECT OBJECT(e) FROM EmpBean e WHERE e.birthDate <  631180800232
Abteilungen ohne Mitarbeiter ermitteln:
SELECT OBJECT(d) from DeptBean d where d.emps IS EMPTY
Alle Mitarbeiter ermitteln, die mehr verdienen als Bob:
SELECT OBJECT(e) FROM EmpBean e, EmpBean b
WHERE b.name = 'Bob' AND e.salary + e.bonus > b.salary + b.bonus
Den Mitarbeiter mit der höchsten Bonuszahlung ermitteln:
SELECT OBJECT(e) from EmpBean e  WHERE e.bonus =
(SELECT MAX(e1.bonus) from EmpBean e1)

Alle oben genannten Abfragen geben EJB-Objekte zurück. Eine Finder-Methode muss immer ein EJB-Objekt für das Home zurückgeben. Eine Select-Methode kann zusätzlich CMP-Felder oder andere EJB-Objekte, die nicht zum Home gehören, zurückgeben.

Die folgenden Abfragen mit der Select-Methode sind für EmpBean gültig. Den Manager für jede Abteilung zurückgeben:
SELECT  d.mgr FROM DeptBean d
Den Namen des Managers von Abteilung 42 zurückgeben:
SELECT  d.mgr.name FROM DeptBean d WHERE  d.deptno = 42
Die Namen der Mitarbeiter in Abteilung 42 zurückgeben:
SELECT e.name FROM EmpBean e WHERE  e.dept.deptno=42
Eine alternative Möglichkeit zum Schreiben derselben Abfrage lautet:
SELECT e.name from DeptBean d, IN (d.emps) AS e WHERE d.deptno=42
Finder- und Select-Abfragen lassen nur ein einziges CMP-Feld bzw. EJB-Objekt in der SELECT-Klausel zu. Eine Select-Abfrage kann Ergebniswerte in Enterprise JavaBeans 2.1 mit SUM, MIN, MAX, AVG und COUNT zurückgeben.
SELECT max(e.salary) FROM EmpBean e WHERE e.dept.deptno=42
Die API für dynamische Abfrage ermöglicht die Verwendung mehrerer Ausdrücke in der SELECT-Klausel. Die folgende Abfrage ist eine gültige dynamische Abfrage, jedoch keine gültige Select- oder Finder-Abfrage:
SELECT  e.name, e.salary+e.bonus as total_pay , object(e), e.dept.mgr
FROM  EmpBean e
ORDER BY 2
Die folgende dynamische Abfrage gibt die Anzahl der Mitarbeiter pro Abteilung zurück:
SELECT e.dept.deptno as department_number , count(*) as employee_count
FROM  EmpBean e
GROUP BY  by e.dept.deptno
ORDER BY 1
Die API für dynamische Abfragen ermöglicht Abfragen, die Methode von Bean- oder Objektwerten enthalten:
SELECT object(e), e.address.format( )
FROM EmpBean e EmpBean e

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tque_ep
Dateiname:tque_ep.html