在Jooq中如何将查询结果fetch到LinkedHashMap以保留orderBy排序顺序
jOOQ查询结果收集为有序LinkedHashMap解决方案
问题描述
我知道在jOOQ中可以使用fetchMap方法将查询结果映射为Map类型,但该方法不支持直接输出LinkedHashMap,无法保留orderBy语句指定的排序顺序。
我最初尝试用如下写法实现:
. . . .orderBy(...) .collect( Collectors.toMap( record -> record.field1(), record -> record.field2(), LinkedHashMap.class));
但field1和field2部分抛出如下错误:
Cannot resolve method 'field1' in 'T'
实现要求
- 在
select方法中,所有字段必须指定类型,计算字段除外,为计算字段强制指定类型会抛出field not found in field list错误。 - 为字段指定类型时需使用
DSL.field(fieldname, type)方法,不可使用DSL.field(fieldname).cast(type),后者也会抛出field not found in field list错误。 - 在
collect方法的collector对象中,获取记录的每个字段时也需要指定类型,示例如下:
record -> record.get(DSL.field("fieldname", Float.class)),
完整代码示例
Table<Record2<Long, Integer>> table1 = ...; Table<Record2<Long, Integer>> table2 = ...; . . . return DSL .select(table1.field("table1_field1", Long.class), DSL.ifnull( table1.field("table1_field2", Float.class) .div(table2.field("table2_field1", Float.class)), 0) .as("result_table_field1")) .from(table1) .join(table2) .on(table1.field("table1_field1", Long.class) .eq(table2.field("table2_field2", Long.class))) .orderBy(DSL.field("result_table_field1")) .collect(Collectors.toMap( record -> record.get(table1.field("table1_field1", Long.class)), record -> record.get(DSL.field("result_table_field1", Float.class)), (v1, v2) -> { throw new InvalidResultException("Duplicate key: " + v1); }, LinkedHashMap::new ));
内容的提问来源于stack exchange,提问作者Snookums
相关产品推荐
相关产品推荐

