可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14

隐式连接类型

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

jOOQ 非常有用的 隐式 JOIN 功能可用于使用路径表示法来连接表,基于它们实际的或合成外键。例如

// Get all books, their authors, and their respective language
create.select(
          BOOK.author().FIRST_NAME,
          BOOK.author().LAST_NAME,
          BOOK.TITLE,
          BOOK.language().CD.as("language"))
      .from(BOOK)
      .fetch();

默认情况下,这将产生

  • 如果外键的所有列都为 NOT NULL,则为 INNER_JOIN
  • 如果外键可为空/可选,则为 LEFT_JOIN
  • 如果隐式连接路径位于 DML 语句中,则为 SCALAR_SUBQUERY
  • 如果路径遵循 to-many 关系,则抛出异常

上述默认值非常重要,以防止隐式连接在不应过滤结果的子句中(例如 SELECT 子句ORDER BY 子句)过滤结果,以及防止它们在这些情况下生成行(在 to-many 连接的情况下)。

用户可能更喜欢强制不同的行为,包括

  • 始终产生 LEFT_JOIN,例如,因为这是 jOOQ 3.14 之前的行为
  • 始终产生 INNER_JOIN,例如,因为他们正在从 Hibernate / JPA 迁移,并且依赖于 Hibernate 的隐式连接产生内部连接
  • 始终产生 SCALAR_SUBQUERY,以保持路径的本地范围(为共享路径段生成重复项)。当隐式连接路径在 DML 语句中呈现时,也会这样做。
  • 始终 THROW 异常。

可以通过以下设置实现此行为更改

示例配置

Settings settings = new Settings()
    .withRenderImplicitJoinType(RenderImplicitJoinType.INNER_JOIN)
    .withRenderImplicitJoinToManyType(RenderImplicitJoinType.LEFT_JOIN);

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo