当前位置: 首页 > 知识库问答 >
问题:

在Jooq中,如何获取LinkedHashMap?

谢飞舟
2023-03-14

我知道,要获取地图,我可以使用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
            ));
    
  • 共有1个答案

    梁渊
    2023-03-14

    这两种方法都假设您使用的是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
       ));
    

    您的尝试未编译的原因是:

    1. 您缺少toMap()
    2. 的强制 mergeFunction参数
    3. 您应该使用value e1()value e2(),而不是field d1()field d2(),但这仅适用于您的结果集中有类型安全的Record2
    4. 如果您没有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正确解析结果。有什么想法吗?