Hibernate, sous-requête, et SQL natif
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:
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.