当前位置: 首页 > 知识库问答 >
问题:

Hibernate Criteria API仅使用id联接到另一个表

索卓
2023-03-14

我正在尝试使用Hibernate条件 API 从一个表连接到另一个表。问题是表合约只有定义为 long(所以没有 FK)的 salesId。然后我不确定如何将合同与销售联系起来。最好在下面的示例中解释。

该模式如下所示:

Table Contract:  
----------------------
   ID  |   salesId   |
----------------------
    1  |      1      |
    2  |      2      |
----------------------

Table Sales:
----------------------
   ID  |     code    |
----------------------
    1  |   SALES_1   |
    2  |   SALES_2   |
----------------------

在合同实体中,我只有私有的Long salesId

我需要实现的是这样的:

getSession().createCriteria(Contract.class)
            .createAlias("salesId", "s") // somehow connect to Sales table
            .add(Restrictions.eq("s.code", salesCode)); // salesCode is param

所以我不能直接使用创建别名↓,因为它不知道Hibernate

.createAlias("sales", "s")

我无法更改模型以在表之间创建 FK。有没有办法解决这个问题?我想避免SQL字符串串联。

编辑:我使用Hibernate Criteria API的原因是其他查询参数(此处未显示)是可选的,因此它们不能作为SQL查询的一部分。这就是为什么我不能使用HQL。

共有3个答案

西门洛城
2023-03-14

可以使用多个Root对象来解决此问题。例如。

var rootContract = criteriaQuery.from(Contract.class);
var rootSales = criteriaQuery.from(Sales.class);

然后定义以下谓词:

predicates.add(criteriaBuilder.equal(rootContract.get("salesId"), rootSales.get("id")));
predicates.add(criteriaBuilder.equal(rootSales.get("code"), "SALES_1"));
田博超
2023-03-14

为什么不使用HQL并编写如下查询:

select * from Contact t1 join Sales t2 where t1.salesId=t2.ID
祁景山
2023-03-14

这可能是您在Hibernate5中的解决方案:

Criteria criteria  = getSession().createCriteria(Contract.class);

Criterion subquery = Restrictions.sqlRestriction("{alias}.salesId = (select id from TABLE_SALES where code = ?)", salesCode, StandardBasicTypes.STRING); 

criteria.add(subquery);

您想将它用于动态查询,然后您可以根据您的业务逻辑在自定义限制上使用该标准。

criteria.add(Restrictions.and(subquery)) -- example
criteria.add(Restrictions.or(subquery)) -- example

PD: TABLE_SALES必须是您在数据库中的销售表名,您也可以预先附加它的模式。

干杯。

 类似资料:
  • 问题内容: 我有4个不同的表要加入。这些表的结构如下: 从表A开始,我了解如何使用b联接表a和c,因为b具有这些表的主键。我也希望能够在TableA上加入表TableD。下面是我的SQL语句,该语句首先连接表A和B,然后将其连接到C: 当我尝试添加另一个联接以包括D时,出现“ TableD”未知的错误: 问题答案: 您想要更多类似这样的东西: 在您的示例中,您实际上并未包含。您要做的就是像以前一样

  • 我是新手。我有以下两张桌子。一张专辑: 另一个是歌曲: 所以所有这些歌曲都属于“自由”专辑。在api调用中,我使用dapper显示所有相册,这很好。 结果如下: 但是我想加入这张专辑的相关歌曲。我试过以下方法,但不起作用,你知道为什么吗? 它只是说:附近的语法不正确。

  • 问题内容: 我在mySQL SELECT语句中使用IF语句,并且根据IF语句返回的结果,我想加入另一个表。 例如。SELECT名称,IF(apple =’brown’,color1,color2)AS从苹果成熟度JOIN apple_type ON apple_type.color =成熟度 我的问题是我收到错误消息:’on子句’中的未知列’ripeness’。有人知道如何根据IF / ELSE中

  • 问题内容: 因为显然每个人都讨厌子选择,所以我想使用联接来做到这一点。 举一个令人难以置信的示例,拿两个表,一个表的列表是1-6的数字,而另一个表的列表是偶数的0-8。然后,我的目标是在表格Nums中输出所有奇数。 如果我只想获取Nums中的偶数列表,我会… 但是,如何使用这些表来获取Nums表中的非偶数列表?或者,换句话说,像… 问题答案: 正确使用SubSELECT可以很好…单独的“某人不喜欢

  • 问题内容: 我读了许多关于仅获得左联接的第一行的主题,但是由于某种原因,这对我不起作用。 这是我的结构(当然是简化的) 提要 艺人 feeds_artists 现在,我想获取文章并仅加入第一位艺术家,我想到了这样的事情: 只是仅获取feeds_artists的第一行,但已经行不通了。 由于数据库原因,我无法使用,也无法按结果对结果进行分组(因为我需要按日期对它们进行排序(我通过这种方式对结果进行分

  • 我读过很多关于只获得左联接的第一行的文章,但是,由于某些原因,这对我不起作用。 这里是我的结构(当然是简化的) 源 只获得feeds_artists的第一行,但这已经不起作用了。 由于数据库的原因,我不能使用并且我不能按对结果进行分组,因为我需要按日期对它们进行排序(我通过这样分组得到了结果,但结果不是最新的) 也尝试了一些外用的东西--也没有成功。老实说,我真的想象不出这些排是怎么回事--这可能