Utilisation de requête EJB
Le langage de requête EJB (Enterprise JavaBeans) est utilisé pour spécifier une requête sur les beans entity gérés par conteneur. Il est similaire à SQL (Structured Query Language). Une requête EJB est indépendante du mappage établi entre le bean et un magasin persistant.
Pourquoi et quand exécuter cette tâche
- Pour définir une méthode de localisation d'un bean entity EJB.
- Pour définir une méthode de sélection d'un bean entity EJB.
- Pour spécifier une requête de façon dynamique à l'aide de l'API dynamique executeQuery.
Le langage de requête EJB du produit est conforme au langage EJB QL défini dans les spécifications Sun EJB 2.1, EJB 3.0 et EJB 3.1 et possède des fonctionnalités supplémentaires comme indiqué à la rubrique Comparaison de la spécification EJB et de WebSphere Query Language.
Procédure
Exemple : Requêtes avec EJB
Voici un exemple de schéma EJB (Enterprise JavaBeans), suivi par un ensemble d'exemples de requêtes.
Schéma EJB | Exemple de requête |
---|---|
Nom de bean entity (nom EJB) | DeptEJB (non utilisé dans la requête) |
Nom de schéma abstrait | DeptBean |
Classe d'implémentation | com.acme.hr.deptBean (non utilisé dans la requête) |
Attributs persistants (zones cmp) |
|
Relations |
|
Schéma EJB | Exemple de requête |
---|---|
Nom de bean entity (nom EJB) | EmpEJB (non utilisé dans la requête) |
Nom de schéma abstrait | EmpBean |
Classe d'implémentation | com.acme.hr.empBean (non utilisé dans la requête) |
Attributs persistants (zones cmp) |
|
Relations |
|
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
Cette requête implique une opération de jointure entre chaque division et sa collection d'employés associée. Lorsqu'une division n'a pas d'employés, elle n'apparaît pas dans le résultat. Lorsqu'une division a plusieurs employés dont le salaire est supérieur à 50000, elle apparaît plusieurs fois dans le résultat.
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)
Toutes les requêtes précédemment répertoriées renvoient des objets EJB. Une requête de méthode de recherche doit toujours renvoyer un objet EJB pour le foyer. Une requête de méthode de sélection peut en plus renvoyer des zones CMP ou d'autres objets EJB n'appartenant pas au foyer.
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