JOOQ多表关联查询时如何安全仅返回指定两表列?
类型安全的JOOQ多表查询返回指定表所有列
直接用fields()方法结合数组拼接就能实现类型安全的查询,不用手动枚举所有列,还能支持迁移:
import java.util.Arrays; context.select( Arrays.stream(TABLE_ONE.fields()) .concat(Arrays.stream(TABLE_TWO.fields())) .toArray(Field[]::new) ) .from(TABLE_ONE) .join(TABLE_TWO).on(TABLE_ONE.foo.eq(TABLE_TWO.foo)) .join(TABLE_THREE).on(TABLE_TWO.bar.eq(TABLE_THREE.bar)) .join(TABLE_FOUR).on(TABLE_THREE.bat.eq(TABLE_FOUR.bat)) .where(TABLE_FOUR.baz.eq(42));
方案优势:
- 类型安全:
TABLE_ONE.fields()和TABLE_TWO.fields()返回的是JOOQ代码生成器生成的强类型Field数组,完全匹配数据库表结构,表字段变更时生成的代码同步更新,支持后续迁移。 - 无需手动枚举:不管两表合计多少列,都能一次性获取所有字段,避开了列数超22时无法用Tuple手动组合的限制。
- 强类型结果映射:查询返回的结果可直接映射到类型安全的
Record或自定义POJO,比asterisk()生成的弱类型结果更可靠。
内容的提问来源于stack exchange,提问作者Chris Roberts
相关产品推荐
相关产品推荐

