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.
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 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
Mais je pense qu'il y a plus simple
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))
Merci d'avance
Phil
Partager