我知道,要获取地图,我可以使用fetchMap,但它不支持LinkedHashMap,我想保持由orderBy创建的插入顺序。
我试过了
.
.
.
.orderBy(...)
.collect(
Collectors.toMap(
record -> record.field1(),
record -> record.field2(),
LinkedHashMap.class));
但是字段1和字段2部分给了我以下错误。
无法解析“T”中的方法“field1”
希望有人能帮我~
谢谢
解决方案:
基于@Lukas的回答,我尝试了几次,发现必须做到以下几点:
>
在select
方法中,所有字段都必须有一个类型,除了那些计算的,其中添加类型会抛出在字段列表中找不到的字段错误。
要向字段添加类型,必须使用DSL。field(fieldname,type)
方法,而不是DSL。field(fieldname)。cast(type)。后者将抛出字段列表中未找到的字段错误。
在收集
方法的收集器
对象中,当获取记录的每个字段时,它们也必须有一个类型。像
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
));
这两种方法都假设您使用的是jOOQ代码生成器
查看Javadoc。它说:
生成的映射是迭代保序的。
它实际上是一个LinkedHashMap
,尽管它不能保证这种确切的类型,因此您必须自行承担风险。
如果编写的查询生成Record2类型,则可以使用以下类型安全收集器:
LinkedHashMap<T1, T2> map =
ctx.select(T.COL1, T.COL2)
.from(T)
.orderBy(...)
.collect(Collectors.toMap(
Record2::value1,
Record2::value2,
(v1, v2) -> { throw new InvalidResultException("Duplicate key: " + v1); },
LinkedHashMap::new
));
您的尝试未编译的原因是:
toMap()
mergeFunction
参数
value e1()
和value e2()
,而不是field d1()
、field d2()
,但这仅适用于您的结果集中有类型安全的Record2
Record2
,而是Record2
,那么您可以在没有类型安全的情况下工作:LinkedHashMap<T1, T2> map =
ctx.select(...)
.from(T)
.orderBy(...)
.collect(Collectors.toMap(
r -> r.get(T.COL1),
r -> r.get(T.COL2),
(v1, v2) -> { throw new InvalidResultException("Duplicate key: " + v1); },
LinkedHashMap::new
));
我的数据库中有一个小特例,我需要从两个具有一对一关系的不同表中获取数据,以获得有用的结果。获取看起来像这样: 当然,我在实际代码中使用了-这只是一个示例。我的问题是是否以及如何将jOOQ中获取的数据写入POJO。我不确定是否有办法让jOOQ为我生成这个POJO,但如果我必须自己编写它,我假设我需要像适配器这样的东西以及像作为数据类型的转换器。 我看到有可能出现RecordMapperProvide
我们有一个功能表和一个层次表,一个层次可以有多个功能。所以想要查询并获得输出作为 字节对应于tierID和特征名称列表 设法从一个老帖子中得到了答案 此外,我们想得到一张
我有三张桌子: 用户键表具有来自用户和键表的主键,以建立用户和键之间的关系。 如何使用所有相关键获取用户? 如果存在其他表(例如,UserRoles)等,该怎么办?通常,如何获取用户和所有通过外键表相关的相关行?
我有一个问题..为什么要重复我在fetch方法中选择的内容。 所以我提供了CON\u CAL\u INSTANCE.DATE。min()在我的select子句中,为什么我必须在fetchOne(CON\u CAL\u INSTANCE.DATE.min())中重复它? 还是我做得不对?
尝试获取表元数据时出错。 使用:JOOQ 3.14.0,PostgeSQL 12,PostgreSQL驱动42.2.10 示例: 错误(这不是整个错误,但其余的是相似的): 示例表创建脚本: 最初,我的目标是获取表索引,这很好。我试图将JOOQ从3.13.1更新到3.14.0,并使用数据库中的不同表进行了测试,但没有成功。
我的数据库中有两个表: 如你所见,作者和书之间有一种关系:作者可以有很多书。在我的申请中,我想获取所有的作者,每个人都有他们的书籍收藏。现在我用代码实现了这个: 不幸的是,它需要对数据库进行许多查询。一个select用于获取作者,另外一个query用于为每个作者获取书籍。我试图连接表,但我不知道如何使用jooq正确解析结果。有什么想法吗?