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 :

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'
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
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 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
 
@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;
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
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();
}
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.
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.