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

Une requête EJB peut être utilisée dans les trois situations suivantes :
  • 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.
Les requêtes de localisation et de sélection sont spécifiées dans le descripteur de déploiement de bean à l'aide de la balise <ejb-ql> ; elles sont compilées en langage SQL au cours du déploiement. Les requêtes dynamique sont incluses dans le code de l'application.

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.

Tableau 1. Schéma EJB et exemples de requêtes. Schéma EJB et 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)
  • deptno - Entier (clé)
  • name - Chaîne
  • budget - Big Decimal
Relations
  • emps - 1:Many avec EmpEJB
  • mgr - Many:1 avec EmpEJB
Tableau 2. Schéma EJB et exemples de requêtes. Schéma EJB et exemples de requêtes
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)
  • empid - Entier (clé)
  • name - Chaîne
  • salary - Big Decimal
  • bonus - Big Decimal
  • hireDate - java.sql.Date
  • birthDate - java.util.Calendar
  • address - com.acme.hr.Address
Relations
  • dept - Many:1 avec DeptEJB
  • manages - 1:Many avec DeptEJB
Address est un objet sérialisable utilisé comme zone cmp dans EmpBean. La définition de address est la suivante :
    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 ( ) { ... } ;
 }
La requête suivante renvoie toutes les divisions :
SELECT OBJECT(d) FROM DeptBean d
La requête suivante renvoie les divisions dont le nom commence par les lettres "Web". Tri du résultat par nom :
SELECT OBJECT(d) FROM DeptBean d WHERE  d.name LIKE  'Web%' ORDER BY d.name
Les mots clés SELECT et FROM sont en majuscules dans les exemples mais vous pouvez aussi les entrer en minuscules. Tout mot réservé employé comme nom dans une requête doit figurer entre guillemets. Vous pouvez trouver une liste des mots réservés à la section Requête EJB : Mots réservés. Les identificateurs indiqués entre guillemets tiennent compte de la différence majuscules/minuscules. Cet exemple montre comment utilise une zone cmp qui est un mot réservé :
SELECT OBJECT(d) FROM DeptBean d  WHERE  d."select" > 5
La requête suivante renvoie tous les employés sous la responsabilité de Robert. Cet exemple montre comment explorer les relations à l'aide d'une expression de chemin d'accès :
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name='Bob'
Une requête peut contenir un paramètre faisant référence à la valeur correspondante de la méthode de recherche ou de sélection. Les paramètres de la requête sont numérotés en commençant à 1 :
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name= ?1
Cette requête montre la navigation dans une relation à plusieurs valeurs et renvoie toutes les divisions dont l'un des employés touche un salaire compris entre 50000 et 90000 maximum :
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.

La requête suivante supprime les divisions en double :
SELECT DISTINCT OBJECT(d) from DeptBean d,  IN (d.emps) AS e  WHERE e.salary > 50000
Pour trouver les employés dont la prime est supérieure à 40% de leur salaire, entrez :
SELECT OBJECT(e) FROM EmpBean e where e.bonus > 0.40 * e.salary
Pour trouver les divisions dont la somme des salaires et des primes versées aux employés dépasse le budget de la division, entrez :
SELECT OBJECT(d) FROM DeptBean d where d.budget < 
( SELECT SUM(e.salary+e.bonus) FROM IN(d.emps) AS e )
Une requête peut contenir des expressions arithmétiques de date et heure de type DB2 si vous utilisez des types de données java.sql.* comme zones CMP et que votre magasin de données est DB2. Pour trouver tous les employés ayant au moins 20 d'ancienneté au 1er janvier 2000, entrez :
SELECT OBJECT(e) FROM EmpBean e where year(  '2000-01-01' - e.hireDate ) >= 20
Si le magasin de données n'est pas DB2 ou si vous préférez utiliser java.util.Calendar comme zone CMP, vous pouvez employer la valeur milliseconde Java dans des requêtes. La requête suivante trouve tous les employés nés avant le 1er janvier 1990 :
SELECT OBJECT(e) FROM EmpBean e WHERE e.birthDate <  631180800232
Pour trouver les divisions sans employés :
SELECT OBJECT(d) from DeptBean d where d.emps IS EMPTY
Pour trouver tous les employés qui touchent plus que Robert :
SELECT OBJECT(e) FROM EmpBean e, EmpBean b
WHERE b.name = 'Bob' AND e.salary + e.bonus > b.salary + b.bonus
Pour trouver l'employé touchant la prime la plus importante :
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.

L'exemple qui suit présente des requêtes admises de méthode de sélection pour EmpBean. Pour renvoyer le responsable de chaque division :
SELECT  d.mgr FROM DeptBean d
Pour renvoyer le nom du responsable de la division 42 :
SELECT  d.mgr.name FROM DeptBean d WHERE  d.deptno = 42
Pour renvoyer les noms des employés de la division 42 :
SELECT e.name FROM EmpBean e WHERE  e.dept.deptno=42
Cette dernière requête peut également être rédigée comme suit :
SELECT e.name from DeptBean d, IN (d.emps) AS e WHERE d.deptno=42
Les requêtes de recherche et de sélection n'acceptent qu'une zone CMP ou qu'un objet EJBObject dans la clause SELECT. Une requête de sélection peut renvoyer des valeurs agrégées dans Enterprise JavaBeans 2.1 à l'aide de SUM, MIN, MAX, AVG et COUNT.
SELECT max(e.salary) FROM EmpBean e WHERE e.dept.deptno=42
L'API de requête dynamique autorise l'utilisation de plusieurs expressions dans la clause SELECT. La requête suivante est une requête dynamique autorisée, mais pas en tant que requête de sélection ou de recherche :
SELECT  e.name, e.salary+e.bonus as total_pay , object(e), e.dept.mgr
FROM  EmpBean e
ORDER BY 2
La requête dynamique suivante renvoie le nombre d'employés de chaque division :
SELECT e.dept.deptno as department_number , count(*) as employee_count
FROM  EmpBean e
GROUP BY  by e.dept.deptno
ORDER BY 1
L'API de requête dynamique admet les requêtes qui contiennent des méthodes objet bean ou valeur:
SELECT object(e), e.address.format( )
FROM EmpBean e EmpBean e

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tque_ep
Nom du fichier : tque_ep.html