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
- 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.
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.
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) |
|
Beziehungen |
|
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) |
|
Beziehungen |
|
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 ( ) { ... } ;
}
SELECT OBJECT(d) FROM DeptBean d
SELECT OBJECT(d) FROM DeptBean d WHERE d.name LIKE 'Web%' ORDER BY d.name
SELECT OBJECT(d) FROM DeptBean d WHERE d."select" > 5
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name='Bob'
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name= ?1
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.
SELECT DISTINCT OBJECT(d) from DeptBean d, IN (d.emps) AS e WHERE e.salary > 50000
SELECT OBJECT(e) FROM EmpBean e where e.bonus > 0.40 * e.salary
SELECT OBJECT(d) FROM DeptBean d where d.budget <
( SELECT SUM(e.salary+e.bonus) FROM IN(d.emps) AS e )
SELECT OBJECT(e) FROM EmpBean e where year( '2000-01-01' - e.hireDate ) >= 20
SELECT OBJECT(e) FROM EmpBean e WHERE e.birthDate < 631180800232
SELECT OBJECT(d) from DeptBean d where d.emps IS EMPTY
SELECT OBJECT(e) FROM EmpBean e, EmpBean b
WHERE b.name = 'Bob' AND e.salary + e.bonus > b.salary + b.bonus
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.
SELECT d.mgr FROM DeptBean d
SELECT d.mgr.name FROM DeptBean d WHERE d.deptno = 42
SELECT e.name FROM EmpBean e WHERE e.dept.deptno=42
SELECT e.name from DeptBean d, IN (d.emps) AS e WHERE d.deptno=42
SELECT max(e.salary) FROM EmpBean e WHERE e.dept.deptno=42
SELECT e.name, e.salary+e.bonus as total_pay , object(e), e.dept.mgr
FROM EmpBean e
ORDER BY 2
SELECT e.dept.deptno as department_number , count(*) as employee_count
FROM EmpBean e
GROUP BY by e.dept.deptno
ORDER BY 1
SELECT object(e), e.address.format( )
FROM EmpBean e EmpBean e