我想为以下本机sql创建创建条件。
不幸的是,我两次使用createCriteria时遇到重复的关联路径错误。当我尝试使用Restrictions.sqlRestriction时。它无法提供我想要的SQL。
尝试1:创建条件-重复的关联路径
Criteria criteria = getSession().createCriteria( Company.class ); criteria.createAlias( "customerCategories", "c1" ); criteria.add( Restrictions.in( "c1.customerCategory.customerCategoryId", company.getBaseCustomerCategoryId() ) ); criteria.createAlias( "customerCategories", "c2" ); criteria.add( Restrictions.in( "c2.customerCategory.customerCategoryId", company.getPromoCustomerCategoryId() ) );
尝试2:创建SQL限制-ORA-00920:由于“ where”,关系运算符无效
Criteria criteria = getSession().createCriteria( Company.class ); criteria.add( Restrictions.sqlRestriction( "INNER JOIN Company_Customercategory a on {alias}.companyId = a.companyId and a.CUSTOMERCATEGORYID = ?", company.getBaseCustomerCategoryId(), LongType.INSTANCE ) ); criteria.add( Restrictions.sqlRestriction( "1=1 INNER JOIN Company_Customercategory b on {alias}.companyId = b.companyId and b.CUSTOMERCATEGORYID = ?", company.getPromoCustomerCategoryId(), LongType.INSTANCE) );
结果错误
select this_.* from Companies this_ where INNER JOIN Company_Customercategory a on this_.companyId = a.companyId and a.CUSTOMERCATEGORYID = 1 and 1=1 INNER JOIN Company_Customercategory b on this_.companyId = b.companyId and b.CUSTOMERCATEGORYID = 6
预期的SQL
select * from companies c inner join Company_Customercategory a on c.companyId = a.companyId and a.CUSTOMERCATEGORYID = 1 inner JOIN Company_Customercategory b on a.companyId = b.companyId and b.CUSTOMERCATEGORYID = 6
感谢你的帮助。谢谢。
关于2005年打开的问题,还有一个旧的Hibernate错误HHH-879org.hibernate.QueryException: duplicate association path仍在打开…
org.hibernate.QueryException: duplicate association path
其他问题已关闭,但没有解决方案HHH-7882
因此,选项1)不太适合。
但是,在上述错误的意见的有用 的解决方法 是使用提及exists
exists
因此,请使用两次sqlRestriction,exists并使用一个相关的子查询来过滤属性类别。您将获得唯一的 企业 连接到这两个类别。
sqlRestriction
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 ) );
这导致以下查询提供正确的结果
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 = ?)