隐式连接类型
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
// 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);
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!