Restriction EJBQL avec sous-requête
Suite de mes aventures EJBQL...
J'en suis donc à cette requête qui fonctionne :
Code:
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:
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:
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:
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 ! :?