Bonjour,
Apparemment les jointures multiples ne sont pas possible en ejb-ql mais il existerait un pluggin pour le faire. Malheureusement je n'arrive pas à le trouver. Est ce que les criteriaQuery peuvent être utilisées pour cela?
Je cherche à faire un lien de généalogie.
En base de donnée on a une table BOM_ITEm qui permet en faisant des jointure entre les codes fils et pères de relier plusieurs levels. Voici ma requête en base donnée qui marche sans problème :
Voici ma classe mappée sur cette table permettant de faire des généalogies :
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 SELECT DISTINCT L6.PLM_BOM_HEADER__CODE FROM PLM_BOM_ITEM L1 JOIN PLM_BOM_ITEM L2 ON L1.PLM_MATERIAL__CODE = L2.PLM_BOM_HEADER__CODE JOIN PLM_BOM_ITEM L3 ON L2.PLM_MATERIAL__CODE = L3.PLM_BOM_HEADER__CODE JOIN PLM_BOM_ITEM L4 ON L3.PLM_MATERIAL__CODE = L4.PLM_BOM_HEADER__CODE JOIN PLM_BOM_ITEM L5 ON L4.PLM_MATERIAL__CODE = L5.PLM_BOM_HEADER__CODE JOIN PLM_BOM_ITEM L6 ON L5.PLM_MATERIAL__CODE = L6.PLM_BOM_HEADER__CODE WHERE L1.PLM_BOM_HEADER__CODE = 'XXXXXXX' AND L1.PLM_BOM_HEADER_TYPE__CODE = 'L1' AND L6.ACTIVITY_STATUS__CODE != '90'
et la classe servant de clé primaire
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
25 @Entity @Table(name="PLM_BOM_ITEM") @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) public class GenealogyNode implements Serializable{ private static final long serialVersionUID = 2944515151628340168L; //Parameters @EmbeddedId private GenealogyNodePK genealogyNodePK; @ManyToOne @JoinColumns({ @JoinColumn(name="PLM_MATERIAL__CODE",referencedColumnName="CODE",insertable=false,updatable=false), @JoinColumn(name="PLM_MATERIAL_TYPE__CODE",referencedColumnName="TYPE",insertable=false,updatable=false) }) private Material material; @Column(name="PLM_BOM_HEADER__CODE") private String bomHeaderCode; @Column(name="PLM_BOM_HEADER_TYPE__CODE") private String bomHeaderType; @Column(name="ACTIVITY_STATUS__CODE") private String activity; @Transient private Integer level = 0;
et voici à présent ma quéry en ejb-ql qui ne fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @Embeddable public class GenealogyNodePK implements Serializable{ private static final long serialVersionUID = -6137271634846362628L; //Parameters @Column(name="PLM_BOM_HEADER__ID") private Integer bomHeaderId; @Column(name="PLM_MATERIAL__CODE") private String productCode; @Column(name="PLM_MATERIAL_TYPE__CODE") private String productType;
J'ai essayé de contourner le problème de la syntaxe join en mettant mes conditions dans le where, ce qui fonctionne également en base donnée directement.
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 @SuppressWarnings("unchecked")@Override public List<String> getListFarChilds2(String fatherCode, String fatherType, String childType) { String query2 = "SELECT DISTINCT "+childType+".bomHeaderCode "+ "FROM GenealogyNode CP,GenealogyNode FG, GenealogyNode RL,GenealogyNode FEP, GenealogyNode DIE,GenealogyNode WAF "+ "WHERE CP.genealogyNodePK.productCode = FG.bomHeaderCode "+ "AND FG.genealogyNodePK.productCode = RL.bomHeaderCode "+ "AND RL.genealogyNodePK.productCode = FEP.bomHeaderCode "+ "AND FEP.genealogyNodePK.productCode = DIE.bomHeaderCode "+ "AND DIE.genealogyNodePK.productCode = WAF.bomHeaderCode "+ "AND "+fatherType+".bomHeaderCode = '"+fatherCode+"' "+ "AND "+fatherType+".bomHeaderType = '"+fatherType+"' "+ "AND "+childType+".bomHeaderType != 'PHAN' "+ "AND "+childType+".activity != '90'"; return entityManager.createQuery(query2).getResultList(); }
Est ce que c'est vraiment normal que hibernate me retourne une liste vide alors qu'en base données je récupère une liste de 10 codes?
Je vous remercie d'avance pour coup de main qui m'aiderait vraiment beaucoup.
EDIT :
Bon ben ça marche, il me semblait avoir essayé ce code une bonne 20taine de fois sans rien obtenir mais voilà qu'il marche impeccablement.
Je le laisse du coup au cas où ça aiderait quelqu'un.
Partager