You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JOOQ 3.19.21中一对一映射表记录转自定义DTO的实现问题

解决jOOQ映射自定义Java Record时参数不匹配问题

问题场景

在Jakarta EE 10项目中使用jOOQ 3.19.21,需要关联PROC表和其关联子表ITER(通过PROC.LAST_ITER_ID = ITER.ID关联,获取每个PROC的最新ITER记录),并将两张表的所有字段一对一映射到自定义Java Record类RProc和RProcIter,要求避免使用Row<?>或Record<?>类型,也不想额外做结果转换。

报错原因

原代码中使用DSL.row(ITER)会将整个ProcIterRecord作为单个参数传入mapping方法,但RProcIter的构造器需要的是多个基础类型参数(对应表的每个字段),而非单个Record对象,因此出现参数数量不匹配的编译错误。

解决方案

将DSL.row(ITER)替换为DSL.row(ITER.fields()),这样jOOQ会将ITER表的所有字段展开为一个多字段的Row对象,mapping(RProcIter::new)就能正确匹配RProcIter的构造器参数列表。同时使用PROC.fields()展开PROC表的所有字段,确保与RProc的构造器参数对应。

修改后的代码

List<RProc> lProc = ctx.select(
        PROC.fields(),
        DSL.row(ITER.fields()).mapping(RProcIter::new)
)
.from(PROC)
.join(ITER)
    .on(PROC.LAST_ITER_ID.eq(ITER.ID))
.where(someCond)
.fetch(Records.mapping(RProc::new));

自定义Record类保持不变:

public record RProc(Integer id, Integer idTipoProc, LocalDateTime dataOra, Double lat, Double lon, String codice, String richiedente, String indirizzo, Integer codiceCom, String descrizione, String note, Integer lastIterId, RProcIter iter) {}

public record RProcIter(Integer id, Integer idProc, LocalDateTime dataora, Integer attivo, Integer modificabile, Integer idUtente, Integer codicePasso, Integer prot, LocalDate dataProt, String nMude, String annotazioni, Integer idEsito, Integer idProcIterLink, Integer giorniSospensione) {}

说明

  • PROC.fields()和ITER.fields()会自动获取对应表的所有字段,无需手动逐个列举,避免遗漏或写错字段。
  • 这种方式直接通过jOOQ的映射能力完成结果到自定义Record的转换,无需额外处理,适合在PrimeFaces DataTable中直接使用,字段访问友好。

内容的提问来源于stack exchange,提问作者crick77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:05:11