Bonjour,

je cherche à mettre en place une requête avec Hibernate, mais je rencontre quelque difficultés.

Situation : je possède une table Table1 qui contient un historique pour plusieurs traitements (id. traitement, date de traitement, numero, champX).

Objectif : récupérer, pour un traitement donné, les lignes Z à Z+100, triés par date de traitement descendant (le tri doit être effectué avant la sélection des 100 lignes).
Je dois également être capable de faire un filtre sur une table Table2.

La Table2 possède un clé étrangère sur la Table1 sur les champs IdTraitement et DateTraitement.
La clé primaire de la Table2 est IdTraitement, DateTraitement, Numero.

Voici la requête que j'ai réussi à obtenir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
select * from 
    (select * (
        select idTraitement, dateTraitement,numero,  rownum r2 
        from Table1 t1 
        where exist (select 1 
                         from Table2 t2 
                         where t2.idTraitement = t1.idTraitement 
                             and t2.dateTraitement = t1.dateTraitement 
                             and t1.champA in <listeA>
                             and t1.champB in <listeB>)
        and t1.idTraitement in <listeID>
        order by idTraitement desc, dateTraitement desc, numero desc) 
    where rownum < Z+100 and r2 > 100) sub
inner join Table2
    on Table2.idTraitement = sub.idTraitement
        and Table2.dateTraitement = sub.dateTraitement
inner join Table1
    on Table1.idTraitement = sub.idTraitement
        and Table1.dateTraitement = sub.dateTraitement
        and Table1.numero = sub.numero
Cette requête est de mémoire, il y a peut-être des erreurs.
J'ai été obligé de faire une première sous-requête avec uniquement les champs de la clé primaire de Table2, pour des raisons de performances. En effet, si je fait le tri avec tous les champs, l'index n'est pas utilisé.
En faisant ainsi, j'arrive à combiner le tri par date avec la récupération des champs Z à Z+100.

Enfin bref, c'est compliqué, mais ca fonctionne assez rapidement et j'ai pas réussi à faire mieux. Pour info, j'ai environ 3 millions de lignes dans la table1.

Maintenant, je voudrais exécuter cette requête via Hibernate en SQL natif (vu la complexité de la requête).

Problème : si j'ai bien compris, Hibernate ne gère pas les sous-requêtes. Et là, y'en a quand même plusieurs.

Quelle solution pouvez-vous me proposez ?
Revoir complètement la requête ? Dans ce cas, je ne pense pas être capable de vraiment pouvoir y arriver.
Y a-t-il un moyen de forcer Hibernate à accepter les sous-requêtes ?
Une autre solution ?
Je ne vois vraiment pas comment je pourrais faire.

Merci de votre aide.

Renaud.