Bonjour,

Je cherche a faire en criteria la requete suivante:

3 tables
la table change
tinId
tinTtId
tinEtape

la table document
docId
docTinId
docEtape
docTtdc

la table sortie
sortieDocId
sortieTciId

la table change est lie a la table document par le champ tinId<>docTinId
et la table document a la table sortie par le champ docId<>sortieDocId .
Mon but dans la requete SQL ci dessous est dans un premier temps avec la sous-requete d extraire un seul record pour un change.tinTtId, et un document.docTtdc, cela afin d'avoir une seule sortieTciId.
Ensuite sur les meme tables de ne prendre que les records qui ont ces deux valeurs commune trouvées dans la sous requetes.
Les valeur de sortieTciId et de Ttdc ne sont pas connus a l'avance, mais les autres champs oui.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
 
	 select  docMaitre.docId,interMaitre.tinTtId, docMaitre.docTtdc, docMaitre.docEtape, subq.sortieTciId from change interMaitre, document docMaitre
                  left outer join 
                  (
                  SELECT  docCherche.docTtdc, sortieCherche.sortieTciId FROM document docCherche, change interCherche, sortie sortieCherche 
                  WHERE interCherche.tinTtId=63 and docCherche.docTinId=interCherche.tinId and  sortieCherche.sortieDocId=docCherche.docId and rownum=1
                  )  subq ON subq.docTtdc=docMaitre.docTtdc
 where InterMaitre.tinTtId=63 and  docMaitre.docTinId=InterMaitre.tinId   and  docMaitre.etape=490  and  tinEtape.etape=200
Dans mon criteria j'en suis la
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
 
DetachedCriteria subq = DetachedCriteria.forClass(Document.class,"docCherche");
            subq.add(Restrictions.eq("docCherche.docEtape", 490)); 
              subq.setProjection( Property.forName("docTtdc") );
             subq.add(Restrictions.sqlRestriction("LIMIT 1")); // le rownum -> on ne prend que le premier record
             subq.createAlias("docCherche.change","interCherche");
            subq.add(Restrictions.eq("interCherche.tinTtyId", 63)); // sur le 63
            subq.add(Restrictions.eq("interCherche.tinEtape", 200)); // a l'etape 200
            subq.createAlias("docCherche.sortieCollection","sortie");
            subq.add(Projections.property("sortieTciId"); // on ne prend que la premiere 
 
 
                DocumentDAO docDao6 = (DocumentDAO) Application.getBean("documentDAO");
                 Criteria criteria =session.createCriteria(Document.class,"docMaitre")
                .add(Restrictions.eq("docMaitre.etape", 490)); 
 
                criteria.createAlias("docMaitre.tinId","interMaitre") 
                .add(Restrictions.eq("interMaitre.tinTtId", 63) 
                .add(Restrictions.eq("interMaitre.tinEtape", 200); 
 
                criteria.createAlias("docMaitre.sortieCollection","sortie"); 
                criteria.createAlias("sortie.tciId","cible")
               .add(Subqueries.propertyIn("cible.tciId", subq))
Mais je pense qu'il y a plus simple
Merci d'avance
Phil