【问题标题】:Hibernate Criteria and multiple joinHibernate Criteria 和多重连接
【发布时间】:2011-01-16 04:26:35
【问题描述】:

有可能使用 Hibernate 标准吗?

select A.something, B.something, C.something, D.something
    from  A JOIN B on A.id = B.id_fk
          JOIN C ON B.id = C.id_fk
          JOIN D ON C.id = D.id_fk;

【问题讨论】:

标签: java hibernate join criteria


【解决方案1】:

我遇到了完全相同的问题,并且能够像这样解决它:

return criteria.createCriteria(A.class)
               .createCriteria("b", "join_between_a_b")
               .createCriteria("c", "join_between_b_c")
               .createCriteria("d", "join_between_c_d")
               .add(Restrictions.eq("some_field_of_D", someValue));

注意:上面代码中的"b""c""d"指的是ABC类中的属性名称,对应地(类A有属性b等等开)。

对于此解决方案,您甚至不需要在 A.hbm.xml 中设置 lazyfetch 参数。

【讨论】:

  • 下面的 SQL 怎么样: select A.columnA1, B.columnB1, C.columnC1 from A inner join B on A.fk_id = B.id inner join C on C.fk_id = B。身份证?
  • 请为此打开一个单独的问题。
【解决方案2】:

Hibernate Reference material 中有一些很好的示例显示使用 setFetchMode 来获取与外部连接的关联。

一个例子是:

List books = sess.createCriteria(Book.class)
.setFetchMode("chapters", FetchMode.EAGER)
.setFetchMode("reviews", FetchMode.EAGER)
.list();

还有information there about different fetching stragies可能对你有用。

【讨论】:

  • 实际上这对我不起作用,我必须像我发布的答案那样做。可能是因为我对D 有额外的标准。
  • FetchMode.EAGER 现在已弃用,请改用FetchMode.JOIN
【解决方案3】:

尝试在您的条件中设置获取模式,例如:

criteria.setFetchMode(..., FetchMode.EAGER)

这将创建一个连接查询。 您可以找到更多详细信息here

【讨论】:

    【解决方案4】:

    是的,实际上有几种方法可以做到这一点:

    1. 映射关联时,将其惰性设置为 false,并将其获取模式设置为加入。这将影响所有条件查询。
    2. 使用其他答案中详述的 setFetchMode。
    3. 使用 criteria.createAlias(或 createCriteria)。这还允许您进一步限制要加入的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2016-07-12
      • 1970-01-01
      • 2021-02-09
      • 2012-08-18
      • 2012-04-09
      • 2013-05-27
      相关资源
      最近更新 更多