Bonjour,
j'utilise Hibernate dans mon application ainsi que des requêtes JPQL comme NamedQuery. D'après la documentation de JPQL on peut faire des LEFT OUTER JOIN (en fait LEFT JOIN) entre des tables qui ont un lien dans le mapping hibernate, mais malheureusement il semble (j'ai essayé et ca ne marche pas) qu'il ne soit pas possible de faire des LEFT OUTER JOIN en specifiant une clause "ON" comme il est possible de faire en SQL pur.

Ce que je veux faire et qui ne marche pas

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
22
 
        @NamedQuery(query = "SELECT " +
                "m " +
                "FROM RMessage m  " +
                "LEFT JOIN m.screen s " +
                "LEFT JOIN s.RActivity a " +
                "LEFT JOIN m.subject sub " +
"LEFT JOIN RActivityStatus actStat on (actStat.id.actId = a.actId and actStat.id.subId = sub.subId) " +
"LEFT JOIN RScreenstatus stat on (stat.id.scrId = s.scrId AND stat.id.subId = sub.subId AND stat.id.sstScrseq = m.sstScrseq), " +
                "RMsgline ml, " +
                "RMsgline ml1, " +
                "WHERE " +
                "ml1.message.msgId = m.msgId and ml1.id.mslId = (select min(ml2.id.mslId) from RMsgline ml2 where ml2.message.msgId = m.msgId) AND " +
                "ml.message.msgId = m.msgId AND " +
                "m.subject.subId = :subId AND " +
                "a.actId = :actId AND " +
                "s.scrId = :scrId AND " +
                "m.sstScrseq = :scrSeq AND " +
                "((m.fieldId is not null and actStat.status <> '777' and stat.sstStatus <> '777') OR (m.fieldId is null and m.msgCenter = 0 and actStat.status <> '777' and stat.sstStatus <> '777') OR m.msgCenter <> 0) AND " +
                "m.msgType = 'Q' " +
                "ORDER BY m.msgDuedt, ml1.id.mslId, ml.id.mslId",
                name = "RMessage.findByStillOpenSubjectActivityAndScreen"),
La table de départ est RMessage. En fait les JOIN se feront que lorsque la propriété "msgCenter" de RMessage est égale à 0. C'est pourquoi j'ai essayé de faire quelque chose dans le style suivant, mais sans succès.

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
22
23
24
 
        @NamedQuery(query = "SELECT " +
                "m " +
                "FROM RMessage m  " +
                "LEFT JOIN m.screen s " +
                "LEFT JOIN s.RActivity a " +
                "LEFT JOIN m.subject sub, " +
                "RMsgline ml, " +
                "RMsgline ml1, " +
                "RActivityStatus actStat, " +
                "RScreenstatus stat " +
                "WHERE " +
                "(m.msgCenter <> 0 OR (m.msgCenter = 0 and stat.id.scrId = s.scrId AND stat.id.subId = sub.subId AND stat.id.sstScrseq = m.sstScrseq)) AND " +
                "(m.msgCenter <> 0 OR (m.msgCenter = 0 and actStat.id.actId = a.actId and actStat.id.subId = sub.subId)) AND " +
                "ml1.message.msgId = m.msgId and ml1.id.mslId = (select min(ml2.id.mslId) from RMsgline ml2 where ml2.message.msgId = m.msgId) AND " +
                "ml.message.msgId = m.msgId AND " +
                "m.subject.subId = :subId AND " +
                "a.actId = :actId AND " +
                "s.scrId = :scrId AND " +
                "m.sstScrseq = :scrSeq AND " +
                "((m.fieldId is not null and actStat.status <> '777' and stat.sstStatus <> '777') OR (m.fieldId is null and m.msgCenter = 0 and actStat.status <> '777' and stat.sstStatus <> '777') OR m.msgCenter <> 0) AND " +
                "m.msgType = 'Q' " +
                "ORDER BY m.msgDuedt, ml1.id.mslId, ml.id.mslId",
                name = "RMessage.findByStillOpenSubjectActivityAndScreen"),
Si vous pouvez m'aider, d'avance merci