【问题标题】:Criteria joining two tables using more than one parameter使用多个参数连接两个表的条​​件
【发布时间】:2012-06-05 15:02:36
【问题描述】:

我有两个相关的表:

+-----------+           +----------+
|   First   |  *     1  |  Second  |
+-----------+ --------- +----------+
| fk_Second |           | id       |
| version   |           | ...      |
| ...       |           | y        |
| x         |           +----------+
+-----------+

Hibernate 有一个从 FirstSecondManyToOne 定义。 {fk_Second, version}First 表的 composite-id(尽管我认为它在这种情况下不相关)。

我正在尝试编写 Criteria 调用,它在 SQL 中看起来像:

SELECT * FROM First WHERE 
   First.fk_Second = Second.id AND 
   First.x = Second.y

我在生成最后一位时遇到了麻烦 - 额外的连接条件。

Criteria c = session.createCriteria(First.class);
   .createCriteria("second", "join_between_first_and_second")
   .add(Restrictions.eqProperty("y", "x")   // <- fails: "x" is not found

在这种情况下我不能使用 HQL 查询。有什么不同的写法吗?可以这样写避免子查询/DetachedCriteria吗?

【问题讨论】:

    标签: java database hibernate join criteria


    【解决方案1】:
    Criteria c = session.createCriteria(First.class, "first");
    c.createAlias("first.second", "theSecond");
    c.add(Restrictions.eqProperty("first.x", "theSecond.y");
    

    如果您没有为属性添加别名,则该属性将被视为条件根实体的一部分(在本例中为第一个)。

    【讨论】:

      【解决方案2】:

      尝试 HQL 'With' 子句..

      SELECT f.* FROM First f left join Second s ON f.fk_Second = s.id with f.x = s.y;
      

      【讨论】:

      • 谢谢,但我已经用 HQL 编写了这个,我需要迁移到 Criteria。我在我的问题中提到我不需要 HQL 解决方案。
      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2016-11-18
      • 2015-10-09
      相关资源
      最近更新 更多