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 :

Restriction EJBQL avec sous-requête


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut Restriction EJBQL avec sous-requête
    Suite de mes aventures EJBQL...

    J'en suis donc à cette requête qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // Requête d'extraction des stages
        private static final String EJBQL = 
            "SELECT thStageStg " +
            "FROM ThStageStg thStageStg, " +
                "IN(thStageStg.teDisciplineDscs) dsc, " +
                "IN(dsc.teConcoursCcrs) ccr, " +
                "IN(ccr.thEtudiantEtus) etu ";
     
        // Restriction sur les stages de la discipline du concours passé par l'étudiant
        private static final String[] RESTRICTIONS = {
            "etu.utiLogin = #{credentials.username}"};
    Mais je dois ajouter une restriction sur les stages où il reste encore de la place.
    La table thStageStg hérite de teSessionSsn qui est en association many to many avec la table thCandidatCnd, via donc une table associative nommée tj_cnd_inscrire_ssn_cis dans la BDD.

    J'ai essayé de compléter la requête précédente de cette façon mais ça ne change rien, j'ai aussi les stages pleins.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        // Requête d'extraction des stages
        private static final String EJBQL = 
            "SELECT thStageStg " +
            "FROM ThStageStg thStageStg, " +
                "IN(thStageStg.teDisciplineDscs) dsc, " +
                "IN(dsc.teConcoursCcrs) ccr, " +
                "IN(ccr.thEtudiantEtus) etu ";
     
        // Restriction sur les stages de la discipline du concours passé par l'étudiant
        private static final String[] RESTRICTIONS = {
            "etu.utiLogin = #{credentials.username} ",
            "(SELECT COUNT(*) " +
            "FROM thCandidatCnd cis " +
            "WHERE cis.cisIdSession = thStageStg.stgIdSession) < #{thStageStg.ssnCapacite} "};
    La requête SQL qui fonctionne et qui prend en compte cette restriction supplémentaire est la suivante :
    Code SQL : 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
    SELECT ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin, 
        cmn.cmn_nom, dpt.dpt_numero, rgn.rgn_nom 
    FROM te_session_ssn ssn 
    INNER JOIN th_stage_stg stg ON stg.stg_id_session = ssn.ssn_id 
        INNER JOIN te_etablissement_etb etb ON etb.etb_id = stg.stg_id_etablissement 
            INNER JOIN tr_commune_cmn cmn ON cmn.cmn_id = etb.etb_id_commune 
                INNER JOIN tr_departement_dpt dpt ON dpt.dpt_id = cmn.cmn_id_departement 
                    INNER JOIN tr_region_rgn rgn ON rgn.rgn_id = dpt.dpt_id_region 
        INNER JOIN tj_stg_concerner_dsc_scd scd ON scd.scd_id_stage = stg.stg_id_session 
            INNER JOIN te_discipline_dsc dsc ON dsc.dsc_id = scd.scd_id_discipline 
                INNER JOIN te_concours_ccr ccr ON ccr.ccr_id_discipline = dsc.dsc_id 
                    INNER JOIN th_etudiant_etu etu ON etu.etu_id_concours = ccr.ccr_id 
    WHERE etu.etu_id_candidat = :idEtudiant 
        AND 
        (
            SELECT COUNT(*)
            FROM tj_cnd_inscrire_ssn_cis cis
            WHERE cis.cis_id_session = ssn.ssn_id
        ) < ssn.ssn_capacite
    On peut aussi la faire de cette façon :
    Code SQL : 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
    SELECT ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin, ssn_capacite, 
        cmn.cmn_nom, dpt.dpt_numero, rgn.rgn_nom 
    FROM te_session_ssn ssn 
    INNER JOIN th_stage_stg stg ON stg.stg_id_session = ssn.ssn_id 
        INNER JOIN te_etablissement_etb etb ON etb.etb_id = stg.stg_id_etablissement 
            INNER JOIN tr_commune_cmn cmn ON cmn.cmn_id = etb.etb_id_commune 
                INNER JOIN tr_departement_dpt dpt ON dpt.dpt_id = cmn.cmn_id_departement 
                    INNER JOIN tr_region_rgn rgn ON rgn.rgn_id = dpt.dpt_id_region 
        INNER JOIN tj_stg_concerner_dsc_scd scd ON scd.scd_id_stage = stg.stg_id_session 
            INNER JOIN te_discipline_dsc dsc ON dsc.dsc_id = scd.scd_id_discipline 
                INNER JOIN te_concours_ccr ccr ON ccr.ccr_id_discipline = dsc.dsc_id 
                    INNER JOIN th_etudiant_etu etu ON etu.etu_id_concours = ccr.ccr_id 
    LEFT OUTER JOIN tj_cnd_inscrire_ssn_cis cis ON cis.cis_id_session = ssn.ssn_id
    WHERE etu.etu_id_candidat = :idEtudiant 
    GROUP BY ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin, ssn_capacite, 
        cmn.cmn_nom, dpt.dpt_numero, rgn.rgn_nom
    HAVING COUNT(cis.cis_id_session) < ssn.ssn_capacite
    Mais là je ne sais carrément pas comment traduire ça en EJBQL !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Une de fois de plus, je m'auto-réponds !

    J'y suis arrivé en me passant du tableau de restrictions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // Requête d'extraction des stages
        private static final String EJBQL = 
            "SELECT thStageStg " +
            "FROM ThStageStg thStageStg, " +
                "IN(thStageStg.teDisciplineDscs) dsc, " +
                "IN(dsc.teConcoursCcrs) ccr, " +
                "IN(ccr.thEtudiantEtus) etu " +
                "LEFT JOIN thStageStg.thCandidatCnds cis " +
                "WHERE etu.utiLogin = #{credentials.username} " +
                "GROUP BY thStageStg " +
                "HAVING COUNT(cis.prsId) < thStageStg.ssnCapacite ";
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. EJBQL : restriction avec sous requête
    Par CinePhil dans le forum JPA
    Réponses: 0
    Dernier message: 26/11/2010, 16h51
  2. [MySQL] erreur avec sous-requête
    Par Piou2fois dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/02/2006, 13h44
  3. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  4. DELETE avec sous-requête
    Par say dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/04/2005, 08h20
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

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