JOOQ中外键关联疑问:调用B.a()查询是否自动使用左连接?
jOOQ中外键关联查询的连接类型说明
针对你提到的场景:主表A、外键表B,通过B.a()访问主表,调用dsl.select(B.a().ID).from(B).fetchInto(String.class)时,jOOQ默认不会使用左连接,而是生成内连接(INNER JOIN)。
原因和细节如下:
- 当通过
B.a().ID这种路径表达式引用关联表字段时,jOOQ默认会自动生成内连接。这种写法隐含了“B表的记录必须对应A表中存在的记录”的语义,只有当关联的外键记录存在时,才会返回结果。 - 上述代码对应的原生SQL大致如下:
SELECT A.ID FROM B INNER JOIN A ON B.A_ID = A.ID
- 如果你的业务需要保留B表中那些外键字段为NULL、没有对应A表记录的行,就必须显式指定左连接,示例代码如下:
dsl.select(B.a().ID) .from(B) .leftJoin(B.a()) .fetchInto(String.class);
此时生成的SQL会使用LEFT JOIN,即使B的外键没有匹配的A记录,也会返回B的行(对应A.ID为NULL)。
内容的提问来源于stack exchange,提问作者Gaziz Bakyt
相关产品推荐
相关产品推荐

