where
dans nos exemples, formalisons tout ceci ici.
where
utilise le plus souvent des variables. Toutes ces variables doivent être définies dans la clause
from
.
On peut définir un chemin à partir d'une variable, qui permet de naviguer dans le modèle objet d'une entité. Ainsi, si une requête définit une variable
bateau
, alors
bateau.equipage
désigne le champ
equipage
de la classe
bateau
.
On ne peut utiliser une relation multivaluée dans une clause
where
que dans deux cas :
is empty
) ;
size()
).
select
sont illégaux en JPQL.
and
,
or
,
not
.
Les opérateurs suivants sont supportés par JPQL.
.
'.
+
et le
-
unaires, les opérateurs de multiplication (
*
), division (
/
), addition (
+
) et soustraction (
-
).
=
,
>
,
>=
,
<
,
<=
,
<>
,
[NOT] BETWEEN
,
[NOT] LIKE
,
[NOT] IN
,
IS [NOT] NULL
,
IS [NOT] EMPTY
,
[NOT] MEMBER [OF]
,
[NOT] EXISTS
.
NOT
,
AND
et
OR
.
AND
à la place.
Exemple 51. Utilisation de l'opérateur
In
select marin from Marin marin where marin.nom in ('Surcouf', 'Tabarly') select marin from Marin marin where marin.commune in (select commune from Commune commune join commune.maire maire where maire.nom = :nom)
IN
. Notons que l'utilisation de ces requêtes est souvent moins performante que l'écriture de jointures.
_
) qui représente un unique caractère quelconque, et le pourcent (
%
) qui représente toute séquence de caractères quelconques, y compris la séquence vide.
true
si cette collection est vide.
where
et
having
. Voyons un exemple de sous-requête.
Exemple 52. Requête imbriquée
select bateau
from Bateau bateau
where (select count(*)
from bateau.equipage) > 10
some
. Les deux autres opérateurs s'utilisent exactement suivant la même syntaxe.
L'opérateur
all
signifie que la comparaison doit être vraie pour tous les éléments de la liste. L'opérateur
some
signifie qu'elle est vraie pour une partie de ces éléments. Elle est fausse si le résultat de la sous-requête est vide. L'opérateur
any
est synonyme de l'opérateur
some
.
Exemple 53. Opérateur
some
select capitaine from Bateau bateau join bateau.capitaine capitaine where bateau.capitaine = capitaine and bateau.equipage is not empty and capitaine.salaire < some (select marin.salaire from bateau.equipage marin)
bateau
tient la relation unidirectionnelle avec
capitaine
. Donc la jointure doit s'exprimer sous la forme
Bateau bateau join bateau.capitaine
.
bateau.equipage is not empty
.
bateau
courant défini dans la requête principale.
bateau.equipage marin
permet de désigner un élément générique de la collection
bateau.equipage
. Il n'est pas utilisé ici dans la clause
where
, mais cela serait parfaitement possible.
ABS(number)
: retourne la valeur absolue du nombre passé en paramètre.
SQRT(number)
: retourne la racine carrée du nombre passé en paramètre.
MOD(integer, integer)
: retourne le reste de la division entière du premier entier passé en paramètre par le second.
SIZE(collection)
: retourne le cardinal de la collection passée en paramètre. La collection doit être une relation multivaluée.
INDEX(collection)
: retourne la position de l'objet courant dans la collection passée en paramètre. Cette collection doit être un alias dans une requête JPQL.
CONCAT(string, string, ...
: réalise la concaténation des chaînes de caractères passées en paramètres.
SUBSTRING(string, begin, length
: extrait une sous-chaîne d'une chaîne donnée. Le paramètre
begin
désigne le premier caractère à sélectionner, et
length
le nombre de ces caractères. S'il n'est pas présent, alors la sous-chaîne s'arrête à la fin de
string
.
TRIM(string)
: supprime les blancs en fin de chaîne de caractères. Cette fonction peut prendre deux arguments supplémentaires. Le premier peut prendre la valeur
leading
,
trailing
ou
both
. Il indique quel côté de la chaîne doit voir ses espaces supprimés, éventuellement les deux. Le second indique le caractère qui doit être supprimé, plutôt que les espaces. Exemple :
TRIM(LEADING 'a' FROM nom)
retourne une chaîne dont on a supprimé les
a
en début.
LOWER(string)
et
UPPER(string)
: retournent une chaîne de caractères résultat de la mise en minuscule ou en majuscule (respectivement) de la chaîne passée en paramètres.
LENGTH(string)
: retourne le nombre de caractères dans la chaîne passée en paramètres.
LOCATE(toLocate, inString, index)
: retourne la position de la chaîne
toLocate
dans la chaîne
inString
. La recherche commence à l'index
index
, qui est un argument optionnel.
CURRENT_DATE
,
CURRENT_TIME
et
CURRENT_TIME_STAMP
. Ces trois fonctions retournent la date courante du serveur, dans chacun des trois formats.
TYPE
. Cette fonction s'utilise de la façon suivante.
Exemple 54. Fonction
TYPE
select personne from Personne personne where TYPE(personne) IN (Marin, Capitaine)