当前位置: 首页 > 面试题库 >

Hibernate Create Criteria两次连接同一表-尝试了2种方法,但有2个差异错误

柳刚豪
2023-03-14
问题内容

我想为以下本机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仍在打开…

其他问题已解决,但未解决HHH-7882

因此,选项1)不太适合。

但是,在上述错误的意见的有用 的解决方法 是使用提及exists

因此,请使用两次sqlRestrictionexists并使用一个相关的子查询来过滤属性类别。您将获得唯一的 企业 连接到这两个类别。

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 = ?)


 类似资料:
  • 问题内容: 我想为以下本机sql创建创建条件。 不幸的是,我两次使用createCriteria时遇到重复的关联路径错误。当我尝试使用Restrictions.sqlRestriction时。它无法提供我想要的SQL。 尝试1:创建条件-重复的关联路径 尝试2:创建SQL限制-ORA-00920:由于“ where”,关系运算符无效 结果错误 预期的SQL 感谢你的帮助。谢谢。 问题答案: 关于2

  • 有没有办法通过两个列表< code>join两个< code > Spark data frame 具有不同的列名? 我知道如果他们在列表中有相同的名字,我可以做以下事情: 或者,如果我知道不同的列名,我可以这样做: 由于我的方法需要2个列表的输入,这些列表指定哪些列将用于每个DF的,因此我想知道Scala Spark是否有办法做到这一点? 页(page的缩写)我在寻找类似python的东西< c

  • 问题内容: 我有2张桌子。为了简化: 表1,用户: userId int,userName nvarchar(50) 表2消息: msgId int,msgFrom int,msgTo int … msg1和msg2都包含userId。现在,我想获取所有消息,但是我想要用户名而不是msgFrom。我知道该怎么办: 一切正常,花花公子。获取用户名而不是msgTo的方法相同。现在的问题是,如何在同一调

  • 例如,计算欧氏距离:。这里,如果或的大小太小/太大,则可能发生下溢/溢出。 解决这一问题的常用方法是用最大的数量级除数。但是,这个解决方案是: 慢(除法慢) 导致一点额外的不准确 所以我想,不除以最大的星等数,让我们把它乘以一个接近的-2的倒数数。这似乎是一个更好的解决办法,因为: 乘法比除法快得多 精度更高,因为乘以2的幂数是精确的 此函数应返回一个规范化的和,两者都是2的幂数,其中接近于,而是

  • 问题内容: 我有一个python脚本正在查询共享Linux主机上的MySQL服务器。出于某种原因,对MySQL的查询通常会返回“服务器已消失”错误: 如果此后立即再次尝试查询,通常会成功。因此,我想知道python中是否有一种明智的方法来尝试执行查询,如果失败,则可以重试固定次数的尝试。可能我想让它尝试5次再完全放弃。 这是我的代码类型: 显然,我可以通过在except子句中进行另一次尝试来做到这

  • 我当前的代码: 但是我要一个java。lang.IllegalArgumentException。 我需要的是在用户表中显示一列。 类似于但是帐户实体没有只有User实体才有的getName()。 *更新 这就是错误所在 Java语言lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:异常描述:语法错误分析查询[SELECT a Accou