JOOQ语法咨询:如何关联CLIENT与OFICE表查询客户双地址数据
正确的JOOQ查询写法
问题分析
你当前的代码存在几个关键问题:
- 仅关联一次
OFFICE表,无法同时获取基础办公地址和额外办公地址两个不同的记录 SELECT语句重复选取OFFICE.ADDRESS,无法区分两个地址字段ClientAndOfficeData记录的字段名存在语法错误(不能用字符串引号,且additional-address不符合Java标识符规范)
修正后的代码实现
1. 修正数据传输对象(DTO)定义
// 修正字段名,符合Java命名规范 public record ClientAndOfficeData( String name, String basicAddress, String additionalAddress ) {}
2. 正确的JOOQ关联查询
需要两次关联OFFICE表,分别为基础地址和额外地址的关联表设置别名,以此区分两个地址字段:
var content = context .select( CLIENT.NAME, // 从基础地址关联表取地址 BASIC_OFFICE.ADDRESS.as("basicAddress"), // 从额外地址关联表取地址 ADDITIONAL_OFFICE.ADDRESS.as("additionalAddress") ) .from(CLIENT) // 第一次关联:基础办公地址 .innerJoin(OFFICE.as("BASIC_OFFICE")) .on(BASIC_OFFICE.ID.eq(CLIENT.BASIK_OFICE_ID)) // 第二次关联:额外办公地址 .innerJoin(OFFICE.as("ADDITIONAL_OFFICE")) .on(ADDITIONAL_OFFICE.ID.eq(CLIENT.ADDITIONAL_OFICE_ID)) // 映射到修正后的DTO .fetchInto(ClientAndOfficeData.class);
补充说明
- 如果允许客户的基础/额外办公地址为空(即字段可能为NULL),可以将
innerJoin替换为leftJoin,避免过滤掉存在空地址的客户记录 - 注意表字段名的拼写:你的表结构里写的是
BASIK_OFICE_ID,确认是否是笔误(正确应为BASIC_OFFICE_ID),如果是笔误需同步修正代码中的字段引用
内容的提问来源于stack exchange,提问作者Yula
相关产品推荐
相关产品推荐

