|
EJB 3 - Les Entreprise Java Bean version 3 (JavaBeans)
3.4.La clause FROM
La clause FROM permet de définir le domaine de la requête.
Voici la description de cette clause :
from_clause
::=
FROM
identification_variable_declaration
{,
{identification_variable_declaration |
collection_member_declaration}}*
identification_variable_declaration
::= range_variable_declaration { join | fetch_join }*
range_variable_declaration
::= abstract_schema_name [AS] identification_variable
join
::= join_spec association_path_expression [AS]
identification_variable
fetch_join
::= join_spec FETCH association_path_expression
association_path_expression
::=
collection_valued_path_expression
| single_valued_association_path_expression
join_spec::=
[ LEFT [OUTER] | INNER ] JOIN
collection_member_declaration
::=
IN
(collection_valued_path_expression) [AS]
identification_variable
3.4.1.Les identifiants
Un identifiant est une séquence de caractère (longueur
infinie). Cependant vous devez faire attention de ne pas utiliser un
identifiant réservé.
Voici la liste de ceux-la :
SELECT,
FROM, WHERE, UPDATE, DELETE,
JOIN,
OUTER, INNER, LEFT, GROUP, BY, HAVING, FETCH, DISTINCT, OBJECT, NULL,
TRUE,
FALSE,
NOT, AND, OR, BETWEEN, LIKE, IN, AS, UNKNOWN[13], EMPTY, MEMBER, OF,
IS, AVG,
MAX,
MIN, SUM, COUNT, ORDER, BY, ASC, DESC, MOD, UPPER, LOWER, TRIM,
POSITION,
CHARACTER_LENGTH,
CHAR_LENGTH, BIT_LENGTH, CURRENT_TIME, CURRENT_DATE,
CURRENT_TIMESTAMP,
NEW, EXISTS, ALL, ANY, SOME.
Nous retrouvons, parmi les identifiants, ceux utilises pour les
variables. Ils doivent être déclarés dans la
clause FROM. Ces identifiants sont « case sensitive ».
Ces variables permettent de représenter une valeur d’un
type d’une expression.
SELECT
DISTINCT o
FROM
Order o JOIN o.lineItems l JOIN l.product p
WHERE
p.productType = ‘office_supplies’
Dans l’exemple ci-dessus :
-
o.lineItems l indique que l est évalué comme étant
n’importe quel LineItem directement lié à un
objet Order.
-
p représente un « Product »
-
o représente un « Order »
3.4.2.Jointures (JOINS)
Vous pouvez spécifier explicitement une jointure dans votre
clause FROM.
Il existe différentes jointures :
-
Inner Join
-
Outer Join
-
Fetch Join
Bien que l’on puisse utiliser d’autres manières de
relier deux entités (ou plus) via l’intruction « IN »
par exemple, le concept de jointure est toujours présent et
nous allons détailler son fonctionnement.
Inner Join
La syntaxe d’une jointure interne est :
[
INNER ] JOIN association_path_expression [AS]
identification_variable
Voici un exemple concret d’utilisation de ce type de jointure :
SELECT
c FROM Customer c JOIN c.orders o WHERE c.status = 1
Cette requête joint les commandes (orders) et les clients
(Customer).
Remarque : le mot clé INNER est optionnel. Il est
principalement utilisé ici pour préciser le type de
jointure au développeur.
La requête précédente équivaut à :
SELECT
OBJECT(c) FROM Customer c, IN(c.orders) o WHERE c.status = 1
L’utilisation du « IN » utilise donc une
jointure interne implicite.
Outer Join
Ce type de jointure permet de récupérer un ensemble
d’entité pour lesquels des valeurs validant la condition
de jointure peuvent être absent.
Voici la syntaxe d’une jointure externe :
LEFT
[OUTER] JOIN association_path_expression [AS]
identification_variable
Voici un exemple d’utilisation de ce type de jointure :
SELECT
c FROM Customer c LEFT JOIN c.orders o WHERE c.status = 1
Remarque : le mot clé OUTER est optionnel.
Fetch Join
Ce type de jointure est spécial dans le sens où il
s’applique aussi bien à une jointure interne qu’à
une jointure externe.
L’utilisation d’une FETCH JOIN permet d’établir
le « fetching » d’une association en tant
que requête indépendante. Ce type de jointure est
spécifié par rapport à une entité et ses
entités relationnelles.
Voici la syntaxe de ce type de jointure :
fetch_join
::= [ LEFT [OUTER] | INNER ] JOIN FETCH
association_path_expression
Voici un exemple d’utilisation de cette requête :
SELECT
DISTINCT c
FROM
Customer c LEFT JOIN FETCH c.orders
WHERE
c.address.state = ’CA’
La requête précédente retourne un ensemble de
client (Customer). De plus les commandes (orders) associées
aux clients sont également retrouvées même si
elles ne sont pas explicitées définies dans la clause
FROM.
Les champs persistants des commandes sont donc également
initialisés.
3.4.3.Collections
Un identificateur de variable déclaré comme un « membre
de collection ». Cet identifiant est déclaré
en utilisant un spécifique opérateur : « IN ».
Le paramètre à donner à cet opérateur est
l’objet collection à utiliser.
Voici la declaration théorique :
collection_member_declaration
::=
IN
(collection_valued_path_expression) [AS]
identification_variable
Voici un exemple de requite utilisant l’opérateur IN :
SELECT
DISTINCT o
FROM
Order o, IN(o.lineItems) l
WHERE
l.product.productType = ‘office_supplies’
Cette requête correspond à :
SELECT
DISTINCT o
FROM
Order o JOIN o.lineItems l JOIN l.product p
WHERE
p.productType = ‘office_supplies’
Dans cet exemple, lineItems est le nom du champ relationnel qui
représente une collection d’instance d’objet de
type : LineItem.
|
|
 |