14.16. Trucs & Astuces

Vous pouvez compter le nombre de résultats d'une requête sans les retourner :

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

Pour trier les résultats par la taille d'une collection, utilisez la requête suivante :

select usr.id, usr.name
from User as usr
    left join usr.messages as msg
group by usr.id, usr.name
order by count(msg)

Si votre base de données supporte les sous-requêtes, vous pouvez placer des conditions sur la taille de la sélection dans la clause where de votre requête:

from User usr where size(usr.messages) >= 1

Si votre base de données ne supporte pas les sous-requêtes, utilisez la requête suivante :

select usr.id, usr.name
from User usr.name
    join usr.messages msg
group by usr.id, usr.name
having count(msg) >= 1

Cette solution ne peut pas retourner un User avec zéro message à cause de la jointure interne, la forme suivante peut donc être utile :

select usr.id, usr.name
from User as usr
    left join usr.messages as msg
group by usr.id, usr.name
having count(msg) = 0

Les propriétés d'un JavaBean peuvent être injectées dans les paramètres nommés d'un requête :

Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size");
q.setProperties(fooBean); // fooBean has getName() and getSize()
List foos = q.list();

Les collections sont paginables via l'utilisation de l'interface Query avec un filtre :

Query q = s.createFilter( collection, "" ); // the trivial filter
q.setMaxResults(PAGE_SIZE);
q.setFirstResult(PAGE_SIZE * pageNumber);
List page = q.list();

Les éléments d'une collection peuvent être triés ou groupés en utilisant un filtre de requête :

Collection orderedCollection = s.filter( collection, "order by this.amount" );
Collection counts = s.filter( collection, "select this.type, count(this) group by this.type" );

Vous pouvez récupérer la taille d'une collection sans l'initialiser :

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue();