BOnjour,

J'utilise Hibernate et l'api Criteria pour la persistance et les requêtes de mes web services Java pour une appli connectée à une BD Oracle.

Le problème que j'ai est le suivant.
J'ai une table T avec des colonnes C1, C2, etc...
J'ai diverses contraintes à vérifier pour le retour de tuples de cette table.
Une d'entre elles est de ne retourner que X valeurs de T ordonnées par le champ C1 pour chaque valeur de C2.

Je n'arrive pas à formuler cela en tant que criterion à ajouter à mes autres critères de recherche sur cette table...
Cela ressemblerait à quelque chose du genre:

critMaxNumberOfReports = Restrictions.sqlRestriction("{alias}.id in (SELECT ID FROM ( " + "SELECT "
+ "ID, ROW_NUMBER() OVER (PARTITION BY r.SHIP_ID order by r.TIME_STAMP1 desc ) AS row_number "
+ "FROM ship_position_report r) " + " WHERE row_number <= " + reportRetrieveCriteriaVO.getNumberOfReports() + ")");

Mais au lieu d'appliquer ce critère globalement à la table ship_position_report (ce qui me retourne toujours les mêmes valeurs si la BD ne bouge pas), il faudrait que j'applique ce filtre de "groupage/comptage" à mon résultat de recherche en cours...

En SQL cela peut s'écrire ainsi :
select * from (
SELECT r.*,
rank() over (partition by R.SHIP_ID order by R.TIME_STAMP1 desc) as rang
FROM (select * from Ship_Position_Report where
<... autres critères ...>)
r) result
where result.rang<3

Mais en "Hibernate/HQL" je ne vois pas comment je peux faire. J'espère qu'il en existe une sinon cela voudrait dire que je dois tout réécrire directement "au format SQL" avec l'api JDBC de base (Query, ResultSet...).
Si vous voyez un moyen merci beaucoup de me l'indiquer!