Les expressions permises dans la clause where incluent la plupart des choses que vous pouvez utiliser en SQL :
opérateurs mathématiques +, -, *, /
opérateur de comparaison binaire =, >=, <=, <>, !=, like
opérateurs logiques and, or, not
Parenthèses ( ), indiquant un regroupement
in, not in, between, is null, is not null, is empty, is not empty, member of and not member of
"Simple" case, case ... when ... then ... else ... end, and "searched" case, case when ... then ... else ... end
concatenation de chaîne de caractères ...||... ou concat(...,...)
current_date(), current_time(), current_timestamp()
second(...), minute(...), hour(...), day(...), month(...), year(...),
N'importe quel fonction ou opérateur défini par EJB-QL 3.0 : substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length(), mod()
coalesce() et nullif()
str() pour convertir des valeurs numériques ou temporelles vers une chaîne de caractères lisible
cast(... as ...), où le second argument est le nom d'un type Hibernate, et extract(... from ...) si le cast() ANSI et extract() sont supportés par la base de données sous-jacente
La fonction HQL index(), qui s'applique aux alias d'une collection indexée jointe
Les fonctions HQL qui s'appliquent expressions représentant des collections : size(), minelement(), maxelement(), minindex(), maxindex(), ainsi que les fonctions spéciales elements() et indices qui peuvent être quantifiées en utilisant some, all, exists, any, in.
N'importe quelle fonction scalaire supportée par la base de données comme sign(), trunc(), rtrim(), sin()
Les paramètres positionnels de JDBC ?
paramètres nommés :name, :start_date, :x1
littéral SQL 'foo', 69, '1970-01-01 10:00:01.0'
Constantes Java public static finaleg.Color.TABBY
in et between peuvent être utilisés comme suit :
from DomesticCat cat where cat.name between 'A' and 'B'
from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )
et la forme négative peut être écrite
from DomesticCat cat where cat.name not between 'A' and 'B'
from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )
De même, is null et is not null peuvent être utilisés pour tester les valeurs nulle.
Les booléens peuvent être facilement utilisés en déclarant les substitutions de requêtes dans la configuration Hibernate :
<property name="hibernate.query.substitutions">true 1, false 0</property>
Ce qui remplacera les mots clés true et false par 1 et 0 dans la traduction SQL du HQL suivant :
from Cat cat where cat.alive = true
Vous pouvez tester la taille d'une collection par la propriété spéciale size, ou la fonction spéciale size().
from Cat cat where cat.kittens.size > 0
from Cat cat where size(cat.kittens) > 0
Pour les collections indexées, vous pouvez faire référence aux indices minimum et maximum en utilisant les fonctions minindex and maxindex. De manière similaire, vous pouvez faire référence aux éléments minimum et maximum d'une collection de type basiques en utilisant
les fonctions minelement et maxelement.
from Calendar cal where maxelement(cal.holidays) > current_date
from Order order where maxindex(order.items) > 100
from Order order where minelement(order.items) > 10000
Les fonctions SQL any, some, all, exists, in supportent que leur soient passées l'élément, l'index d'une collection (fonctions elements et indices) ou le résultat d'une sous requête (voir ci dessous).
select mother from Cat as mother, Cat as kit where kit in elements(foo.kittens)
select p from NameList list, Person p where p.name = some elements(list.names)
from Cat cat where exists elements(cat.kittens)
from Player p where 3 > all elements(p.scores)
from Show show where 'fizard' in indices(show.acts)
Notez que l'écriture de - size, elements, indices, minindex, maxindex, minelement, maxelement - peuvent seulement être utilisée dans la clause where dans Hibernate3.
Les éléments de collections indexées (arrays, lists, maps) peuvent être référencés via index (dans une clause where seulement) :
from Order order where order.items[0].id = 1234
select person from Person person, Calendar calendar
where calendar.holidays['national day'] = person.birthDay
and person.nationality.calendar = calendarselect item from Item item, Order order where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11
select item from Item item, Order order where order.items[ maxindex(order.items) ] = item and order.id = 11
L'expression entre [] peut même être une expression arithmétique.
select item from Item item, Order order where order.items[ size(order.items) - 1 ] = item
HQL propose aussi une fonction index() interne, pour les éléments d'une association one-to-many ou d'une collections de valeurs.
select item, index(item) from Order order
join order.items item
where index(item) < 5Les fonctions SQL scalaires supportées par la base de données utilisée peuvent être utilisées
from DomesticCat cat where upper(cat.name) like 'FRI%'
Si vous n'êtes pas encore convaincu par tout cela, imaginez la taille et l'illisibilité qui caractériseraient la transformation SQL de la requête HQL suivante :
select cust
from Product prod,
Store store
inner join store.customers cust
where prod.name = 'widget'
and store.location.name in ( 'Melbourne', 'Sydney' )
and prod = all elements(cust.currentOrder.lineItems)Un indice : cela donnerait quelque chose comme
SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order
FROM customers cust,
stores store,
locations loc,
store_customers sc,
product prod
WHERE prod.name = 'widget'
AND store.loc_id = loc.id
AND loc.name IN ( 'Melbourne', 'Sydney' )
AND sc.store_id = store.id
AND sc.cust_id = cust.id
AND prod.id = ALL(
SELECT item.prod_id
FROM line_items item, orders o
WHERE item.order_id = o.id
AND cust.current_order = o.id
)