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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:54:07