|
EJB 2 - Les Entreprise Java Bean (JavaBeans)
5.4.Clause WHERE
Vous allez pouvoir utiliser des valeurs littérales pour
limiter le nombre d’éléments sélectionnés.
Cela s’accomplit via la clause « WHERE »
comme vous pouvez la connaître en SQL.
Vous pouvez également utiliser des paramètres en entrée
et les utiliser pour effectuer des comparaisons d’objets …
5.4.1.Opérandes littérales
Les opérandes littérales correspondent à des
valeurs « en dures ». De ce fait, vous ne
pouvez comparer que les champs persistants.
Vous pouvez comparer des chaines de caractères (String), des
valeurs numériques (long, double, float …) ainsi que
les valeurs booléennes.
SELECT
OBJECT( c )
FROM
Client c
WHERE
c.carteCredit.organisation = ‘American Express’
SELECT
OBJECT( v )
FROM
Vol v
WHERE
v.poidsMax = 100000.00
SELECT
OBJECT( c )
FROM
Client c
WHERE
c.aToutPaye = TRUE
5.4.2.Paramètres d’entrée
Les méthodes dites « à requête »
(Query Methods) qui utilisent l’EJB-QL peuvent spécifier
des arguments. Ces valeurs d’entrées peuvent alors être
mappées à l’EJB-QL et donc limiter le nombre de
réponses. Par exemple, imaginons une requête permettant
de récupérer l’ensemble des clients résidant
dans une ville précise :
//
Méthodes dans la home interface
public
Collection findParVille(String ville, String pays) throws
FinderException;
//
EJB-QL
SELECT
OBJECT( c )
FROM
Client c
WHERE
c.adresse.ville = ?1
AND
c.adresse.pays = ?2
La liaison entre les paramètres de la méthode et ceux
de la requête se fait via le préfixe ‘ ?’
suivit de la position de l’argument de la méthode.
De plus, ces paramètres ne sont pas limités qu’aux
champs persistants, ils peuvent également être des
références à d’autres EJB. Voici un
exemple qui recherche les croisières à partir d’un
vol :
//
Méthodes dans la home interface
public
Collection findParVol( VolLocal vol ) throws FinderException;
//
EJB-QL
SELECT
OBJECT( c )
FROM
Croisiere c
WHERE
c.vol = ?1
Quand vous utilisez un objet EJB en tant que paramètre
d’entrées, le conteneur effectue la comparaison en se
basant sur la clé primaire de cet EJB.
Dans notre exemple, il cherche parmi l’ensemble des EJB
Croisiere, une référence à l’EJB Vol ayant
la même clé que l’EJB Vol passé en
paramètre.
5.4.3.Opérateurs
Vous pouvez retrouver l’ensemble des opérateurs SQL de
base en EJB-QL.
Voici l’ordre d’évaluation de ces opérateurs :
-
Navigation (.)
-
Arithmétique
-
+,- (unaire)
-
*,/ (multiplication, division)
-
+,- (addition, soustraction)
-
Comparaison
-
=,>,>=,<,<=,<> (différent)
-
LIKE, BETWEEN, IN, IS NULL, IS EMPTY, MEMBER OF
-
Logique
-
NOT, AND, OR
Remarque : les opérateurs de comparaison contenant les
caractères : ‘<’, ‘>’
peuvent poser des problèmes dans le descripteur de
déploiement. En effet, ces caractères correspondent à
l’ouverture / fermeture de balises. Il faut donc déclarer
les requête EJB-QL dans des sections CDATA.
<![CDATA[SELECT
OBJECT( r ) FROM Reservation r
WHERE
r.totalPaye > 300.00]]>
Logiques
Les opérateurs logiques tels que AND, OR et NOT correspondent
exactement à ceux du SQL. Ces opérateurs évaluent
seulement des expressions booléennes.
De ce fait, ces opérateurs ont la plus basse priorité
car ils évaluent des ensembles pouvant servir à
représenter une valeur logique.
Comparaisons
L’ensemble des opérateurs de comparaison sont familiers.
Que ce soit le <, > ou le <=, >=, <>. Vous utilisez
les mêmes opérateurs en SQL.
Cependant, seuls les opérateurs <> (différent) et
= (égal) peuvent être utilisés avec des
références à des objets EJB.
Les opérateurs : >, >=, <, <= peuvent
uniquement être utilisés avec des valeurs numériques.
5.4.4.Égalités
Il est égal de comparer une valeur numérique de type
short, int ou long à une valeur numérique approximative
de type double ou float. En opposition, les autres types (String …)
doivent être exactement égales. Vous ne pouvez pas
comparer une string « 123 » et la valeur
numérique 123.
Les objets EJB peuvent être comparés avec l’égalité,
mais ils doivent avoir exactement le même type. Ils doivent
donc être inclus dans le même déploiement.
La comparaison se fait alors sur la clé primaire. Si les deux
objets comparés ont la même clés, alors ils sont
égaux.
Remarque : les objets de type java.util.Date ne peuvent être
comparés. Si vous souhaitez comparer une date, vous devrez
utiliser un champ persistant de type long et vérifier
l’égalité avec la date via une valeur numérique
(de type long).
5.4.5.Utilisation de « BETWEEN »
La clause BETWEEN permet de spécifier un interval de valeur
pour la comparaison. Vous pouvez par exemple, récupérer
l’ensemble des vols dont le poids maximal est entre 8000 et
10000 tonnes.
SELECT
OBJECT( v )
FROM
Vol v
WHERE
v.poidsMax BETWEEN 8000.00 AND 10000.OO
Vous ne pouvez utiliser cette clause ni avec des références
d’objets EJB, ni String, ni boolean.
5.4.6.Utilisation de « IN »
L’opétareur conditionnel IN n’est pas le même
dans la clause WHERE que dans la clause FROM.
Dans la clause WHERE, IN teste si une valeur appartient à un
ensemble de valeurs. Vous utiliserez cet opérateur qu’avec
des valeurs de type String.
SELECT
OBJECT( c )
FROM
Client c
WHERE
c.adresse.pays IN (‘FR’, ‘ALL’, ‘ES’)
5.4.7.Utilisation de « IS
NULL »
Cet opérateur vous permet de vérifier si une valeur est
null. Vous pouvez donc vérifier qu’une valeur
d’une entité n’est pas spécifiée :
SELECT
OBJECT( c )
FROM
Customer c
WHERE
c.adresse IS NULL
Cette requête retourne l’ensemble des clients n’ayant
pas d’adresse.
Remarque : des problèmes peuvent survenir lorsque vous
utilisez la clause BETWEEN ou IN avec des champs ayant des contenus
« null ». En effet, le résultat d’un
test sur un champ null (par BETWEEN ou IN) entraine un « UNKNOWN »
résultat. Pour résoudre ce problème il faut
absolument qu’aucun champ soit null. Vous pouvez vous assurer
de cela en initialisant l’ensemble des valeurs (dont le type
n’est pas primitif) en leur affectant une valeur par défaut
dans les méthodes ejbCreate() et ejbPostCreate().
5.4.8.Utilisation de « IS
EMPTY »
L’opérateur IS EMPTY permet de tester si une collection
basée sur une relation est vide. Rappelons qu’une
collection basée sur une relation n’est jamais null,
cependant si cette collection retourne aucun objet, alors vous aurez
une collection vide (empty).
SELECT
OBJECT( croisiere )
FROM
Croisiere croisiere
WHERE
croisiere.reservations IS EMPTY
Ici, nous récupérons l’ensemble des croisieres
n’ayant pas de réservations.
5.4.9.Utilisation de « MEMBER
OF »
L’opérateur MEMBER OF est un outil très puissant
vous permettant de tester si un objet est un membre d’une
collection specifique.
SELECT
OBJECT( croisiere )
FROM
Croisiere croisiere, Client client
WHERE
c = ?1
AND
c MEMBER OF croisiere.reservations
Cette requête permet de déterminer si un client
particulier (spécifié en argument d’entrée
de la méthode) est un membre de n’importe quelle
relation : Reservation – Client.
5.4.10.Utilisation de « LIKE »
Vous retrouvez également l’opérateur LIKE en
EJB-QL. Cet opérateur vous permet de vérifier qu’une
String correspond à un modèle défini.
SELECT
OBJECT( c )
FROM
Client c
WHERE
c.nom LIKE ‘Jean%’
La requête retourne l’ensemble des clients dont leur nom
commence par : « Jean » .
Vous pouvez utiliser le caractère ‘%’ pour
indiquer une séquence de plusieurs caractères et ‘_’
pour indiquer un unique caractère.
5.4.11.Fonctions sur les expressions
L’EJB-QL possède 4 fonctions de traitement des String et
2 pour les opérations basic sur les nombres.
String
Voici une description de l’ensemble des 6 fonctions liées
au String :
-
CONCAT( String1, String2) : concatenne deux string ensemble.
-
SUBSTRING(String1, start, length) : retourne la séquence
de string1 commençant à la position start et de
longueur length.
-
LOCATE(String1, String2 [, start]) : retourne un entier
indiquant la position de String1 dans String2. Si start est présent,
cet argument indique la position diu début de la recherche.
-
LENGTH(String) : retourne la longueur de la chaine (entier).
Numérique
-
ABS(number) : retourne la valeur absolue d’un nombre
(int, float, double)
-
SQRT(double) : retourne la racine carrée d’un
nombre (double).
|
|
 |