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 :
Cette requête est de mémoire, il y a peut-être des erreurs.
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
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.
Partager