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
相关产品推荐
相关产品推荐

