Istnieje stary błąd Hibernate HHH-879 dotyczący problemu org.hibernate.QueryException: duplicate association path
otwarty 2005 i nadal otwarty...
Inny problem jest zamknięty bez rozwiązania HHH-7882
Tak więc opcja 1) jest raczej nieodpowiednia.
Ale w komentarzach do powyższego błędu przydatne obejście jest wspomniany przy użyciu exists
Więc użyj dwukrotnie sqlRestriction
z exists
oraz skorelowane podzapytanie filtrujące właściwą kategorię. Otrzymasz tylko firmy połączone z obiema kategoriami.
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 ) );
Prowadzi to do następującego zapytania, które zapewnia poprawny wynik
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 = ?)