【发布时间】:2021-12-29 17:26:12
【问题描述】:
我知道要插入Map,我可以使用fetchMap,但它不支持LinkedHashMap,我想保持orderBy创建的插入顺序。
我试过了
.
.
.
.orderBy(...)
.collect(
Collectors.toMap(
record -> record.field1(),
record -> record.field2(),
LinkedHashMap.class));
但 field1 和 field2 部分给了我以下错误。
无法解析“T”中的方法“field1”
希望有人能帮帮我~
谢谢!
解决方案:
根据@Lukas的回答,我试了几次,发现以下几点是必须要做的:
-
在
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
));
【问题讨论】:
-
你为什么要声明
LinkedHashMap在你身边?