Bonjour,

Je suis tombé sur un cas étrange:

Ci-après mon utilisation de l'API Criteria:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
	DetachedCriteria criteria = DetachedCriteria.forClass(ReturnGroupingFile.class, "rgpt");
		criteria.setFetchMode("rgpt.returnFiles", FetchMode.JOIN);
		criteria.createAlias("rgpt.returnFiles", "rf", CriteriaSpecification.LEFT_JOIN);
		criteria.setFetchMode("rf.returns", FetchMode.JOIN);
		criteria.createAlias("rf.returns", "r", CriteriaSpecification.LEFT_JOIN);
	        criteria.add(Restrictions.in("id", ids));
	       criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
Cela effectue des doublons au niveau rgpt.returnFiles autant de fois qu'il y a de fils dans rf.returns. C'est un problème connu d'Hibernate... enfin je crois.

rf.returns est de type List est implémentations ArrayList mais rgpt.returnFiles est une implémentatio d'un Set.

L'une des solution serait d'effectue la conversion suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Collection result = new LinkedHashSet( List<ReturnGroupingFile>)(hibernateTemplate.findByCriteria(criteria));
et là... chose que je n’attendais pas..... c'est que les doublons sont encore là.....

Vous aller me dire: - As-tu revu des méthode equals et HashCode oui elles y sont pas de soucis.....

et quand je fais une itération sur la collection result, si je fais un equals sur les objets je constante que theObject.equals(otherObject) = true....



Je vous remercie pour votre aide.