(懒惰)使用 Hibernate Criteria API 的 LEFT OUTER JOIN

Posted

技术标签:

【中文标题】(懒惰)使用 Hibernate Criteria API 的 LEFT OUTER JOIN【英文标题】:(Lazy) LEFT OUTER JOIN using the Hibernate Criteria API 【发布时间】:2011-01-13 11:41:29 【问题描述】:

我想使用 Criteria API 在两个表之间执行 LEFT OUTER JOIN。我在 Hibernate 文档中只能找到这种方法:

Criteria criteria = this.crudService
            .initializeCriteria(Applicant.class)
            .setFetchMode("products", FetchMode.JOIN)
            .createAlias("products", "product");

但是,由于它返回的结果数量,这要么执行内连接,要么执行右外连接。

我还希望我的加入是 Lazy。我该怎么做?

干杯!

更新:似乎使用别名会自动连接 INNER JOIN。 “背景故事”中有些东西我还没有掌握。所以,今天没有别名。这给我留下了对这两个表应用限制的问题,因为它们都有一个列(或属性,如果这更合适的话)'name'。

【问题讨论】:

接受答案。 我想知道您对“默认情况下 Hibernate 中的 createAlia() 会创建一个 INNER JOIN”的引用。我已经搜索了 API,但看不到它。谢谢。 【参考方案1】:

如果您需要在产品表上左连接,只需执行以下操作:

.....createAlias("产品", "产品", Criteria.LEFT_JOIN);

【讨论】:

现已弃用,使用 Ankit 的答案【参考方案2】:

Sdavids 答案的 API 现在是 deprecated。它的更新版本是

....createAlias("employee", "emp", JoinType.LEFT_OUTER_JOIN)

【讨论】:

谢谢。它可以帮助我消除对已弃用 API 的使用【参考方案3】:

SQL 请求中有一个连接。不能偷懒。


使用 Hibernate,要延迟检索这些数据,只需将其从 HQL 请求中排除。然后,当您访问实体上的 getter 时(如果您的 Session 仍然打开),它将自动加载(您不必编写请求的那部分)。

【讨论】:

抱歉,我没听懂。也许我应该改写:我想要一个 LEFT OUTER JOIN,但我也希望仅在需要时才实际检索数据(调用适当的 getter)。懒惰(或渴望)是否与发生的 SQL JOIN 类型有某种联系? 惰性可以通过对象实现,但不能通过 SQL 请求实现。一个请求完全执行一次,它的设计不是为了在需要时稍后执行部分请求! 在 HQL 中我写的是 LEFT OUTER JOIN FETCH。那么,想必一个HQL查询对应很多SQL查询,需要时执行?无论如何,无论是否懒惰,我怎样才能进行 LEFT OUTER JOIN?而不是在 HQL 中,使用 Criteria API。干杯! @Markos 对于连接,HQL 查询仅转换为一个等效的 SQL 查询。对于标准部分,我不是专家... :-)

以上是关于(懒惰)使用 Hibernate Criteria API 的 LEFT OUTER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 中Criteria Query查询详解

是否可以使用 Criteria 或 DetachedCriteria Hibernate 进行此查询

hibernate hql查询 与Criteria 查询语句区别和效率

如何使用 Hibernate Criteria 编写此查询

Hibernate中 Restrictions.like() 方法

Hibernate---criteria的具体使用列子