Existe um antigo bug do Hibernate HHH-879 no problema de
org.hibernate.QueryException: duplicate association path
aberto em 2005 e ainda aberto... Outro problema está encerrado sem solução HHH-7882
Portanto, a opção 1) não é adequada.
Mas nos comentários do bug acima, uma solução útil é mencionado usando
exists
Então use duas vezes
sqlRestriction
com exists
e uma subconsulta correlacionada filtrando a categoria apropriada. Você receberá apenas empresas ligados a ambas as categorias. 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 ) );
Isso leva à seguinte consulta que fornece o resultado correto
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 = ?)