jOOQ多表查询无POJO场景下如何将Table1Record与关联表日期映射为Map
实现方案
你可以在获取结果集后手动做映射,通过jOOQ提供的into(Table)方法从查询结果中抽取Table1Record实例,写法如下:
Map<Table1Record, LocalDate> map = dslContext.select(table1, table2.DATE) .from(table1) .join(table2).on(table1.ID.eq(table2.ID)) .fetch() .intoMap( record -> record.into(table1), record -> record.get(table2.DATE) );
原写法失效原因
你最初调用fetchMap(table1, table2.DATE)无法正常执行,是因为jOOQ的该重载方法要求查询结果中第一个参数对应的表结构是独立的Record返回项,直接传入整表作为select项时,不会自动将结果映射为对应的Table1Record作为Map的key,会出现类型匹配错误。
扩展说明
即使你习惯用展开字段的写法select(table1.fields(), table2.DATE),也可以用完全相同的映射逻辑实现需求,into(table1)会自动从查询结果的平级字段中匹配table1对应的字段生成Table1Record实例:
Map<Table1Record, LocalDate> map = dslContext.select(table1.fields(), table2.DATE) .from(table1) .join(table2).on(table1.ID.eq(table2.ID)) .fetch() .intoMap( record -> record.into(table1), record -> record.get(table2.DATE) );
如果两张表存在同名字段,建议给表设置别名避免字段匹配混乱:
// 别名写法避免同名字段冲突 Table1 t1 = table1.as("t1"); Table2 t2 = table2.as("t2"); Map<Table1Record, LocalDate> map = dslContext.select(t1.fields(), t2.DATE) .from(t1) .join(t2).on(t1.ID.eq(t2.ID)) .fetch() .intoMap( record -> record.into(t1), record -> record.get(t2.DATE) );
内容的提问来源于stack exchange,提问作者Hayami Pysh
相关产品推荐
相关产品推荐

