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) >= 1Cette 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) = 0Les 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();