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();