IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Hibernate, sous-requête, et SQL natif [Core]


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2007
    Messages : 94
    Par défaut 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 : 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.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2007
    Messages : 94
    Par défaut
    Finalement, j'ai trouvé le problème.

    Hibernate accepte bien les sous-requêtes. C'est juste que je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.createQuery(requete)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.createSQLQuery(requete)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Group by dans un sous requête avec SQL SERVER
    Par Rymaya dans le forum Développement
    Réponses: 15
    Dernier message: 29/05/2012, 15h30
  2. Exécuter une requête en SQL natif
    Par sebounator dans le forum Hibernate
    Réponses: 0
    Dernier message: 05/02/2010, 17h54
  3. Requête insert SQL natif
    Par kenshiroseifu dans le forum Hibernate
    Réponses: 2
    Dernier message: 17/07/2009, 18h50
  4. problème sous-requête SQL et order by
    Par aguest dans le forum Requêtes
    Réponses: 10
    Dernier message: 26/12/2005, 23h57
  5. Sous-requêtes SQL
    Par mandrake256 dans le forum WinDev
    Réponses: 6
    Dernier message: 21/06/2005, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo