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