Il existe un ancien bogue Hibernate HHH-879 sur le problème de org.hibernate.QueryException: duplicate association path
ouvert en 2005 et toujours ouvert...
L'autre problème est fermé sans solution HHH-7882
L'option 1) n'est donc pas adaptée.
Mais dans les commentaires du bogue ci-dessus, une solution de contournement utile est mentionné en utilisant exists
Utilisez donc deux fois sqlRestriction
avec exists
et une sous-requête corrélée filtrant la catégorie appropriée. Vous n'obtiendrez que des entreprises connecté aux deux catégories.
crit.add( Restrictions.sqlRestriction(
"exists (select null from Company_Customercategory a where {alias}.company_Id = a.company_Id and a.CUSTOMERCATEGORYID = ?)",
1, IntegerType.INSTANCE ) );
crit.add( Restrictions.sqlRestriction(
"exists (select null from Company_Customercategory a where {alias}.company_Id = a.company_Id and a.CUSTOMERCATEGORYID = ?)",
6, IntegerType.INSTANCE ) );
Cela conduit à la requête suivante qui fournit le résultat correct
select this_.COMPANY_ID as COMPANY_ID1_2_0_, this_.COMPANY_NAME as COMPANY_NAME2_2_0_
from COMPANIES this_
where exists (select null from Company_Customercategory a
where this_.company_Id = a.company_Id and a.CUSTOMERCATEGORYID = ?) and
exists (select null from Company_Customercategory a
where this_.company_Id = a.company_Id and a.CUSTOMERCATEGORYID = ?)