无法将行转换为模型

Posted

技术标签:

【中文标题】无法将行转换为模型【英文标题】:Cannot convert row to model 【发布时间】:2021-12-27 04:00:01 【问题描述】:

使用 JOOQ 3.15,我尝试映射嵌套项。

CREATE TABLE a_table (
    id uuid primary key
);


CREATE TABLE b_table (
    id uuid primary key
);

CREATE TABLE c_table (
    a_id uuid REFERENCES a_table(id) NOT NULL,
    b_id uuid REFERENCES b_table(id) NOT NULL,
    started_date timestamp with time zone,
    completed_date timestamp with time zone,
    PRIMARY KEY (a_id, b_id)
);

这些类只是标准 POJO,带有用于上述值的 getter、setter。

然后我有一个类似的查询:

// aId, and bId are passed in as parameters
select(
        A_TABLE.asterisk(),
        row(
                C_TABLE.STARTED_DATE.as("dateStarted"),
                C_TABLE.COMPLETED_DATE.as("dateCompleted")
        ).as("c").convertFrom(r -> r.into(CDomain.class))
).from(A_TABLE)
.leftOuterJoin(C_TABLE)
        .on(C_TABLE.A_ID.eq(A_TABLE.ID).and(C_TABLE.B_ID.eq(bId)))
.where(A_TABLE.ID.eq(aId))).as("a").convertFrom(r -> r.into(ATableRecord.class))

C 的条目可能不存在。

我在运行这段代码时遇到的错误是:

org.jooq.exception.DataTypeException: Cannot convert from class C 
    dateStarted: null
    dateCompleted: null
 (class com.blah.C_TABLE) to class org.jooq.impl.RecordImpl4

为什么会出现这个错误?当我要求它将记录转换为类时,为什么它试图从我的类转换为记录?我该如何解决这个问题?

【问题讨论】:

A、B、C 类的外观如何?您是否尝试像这里描述的那样加载嵌套类? blog.jooq.org/…那你应该使用multiset 您的实际表 A 的列集是否与您的 jOOQ 生成的代码对 A 的了解完全对应?使用A.asterisk()时总是存在不匹配的风险 @LukasEder 是的。但我意识到你是对的,我切换到fieldsRow()@SimonMartinelli 它们只是上述值的简单 POJO。最后,我通过获取完整的 fieldsRow()s 并将其映射到自动生成的 JOOQ pojos,然后根据需要应用翻译来解决了这个问题。 酷。你可以在这里回答你自己的问题,所以也许将来有人会发现它有用。 【参考方案1】:

我仍然不确定我的错误的确切根本原因,但我发现使用当前的 JOOQ(撰写本文时为 3.15),使用Records、fieldsRow() 和自动这样生成 POJO:

// Here ATableRecord and CTableRecord are autogenerated by JOOQ based on the table definitions
record ACContainerRecord (ATableRecord a, CTableRecord c);

select(
        A_TABLE.fieldsRow().as("a").convertFrom(r -> r.into(ATableRecord.class)),
        C_TABLE.fieldsRow().as("c").convertFrom(r -> r.into(CTableRecord.class))
).from(ATable)
    .leftOuterJoin(C_TABLE)
        .on(C_TABLE.A_ID.eq(A_TABLE.ID).and(C_TABLE.B_ID.eq(bId)))
    .where(A_TABLE.ID.eq(aId))).as("a")

    // Fetch into the custom holding record
    .fetch(Records.mapping(ACContainerRecord::new))

    // Map it onto our desired domain classes
    .stream()
    .map(r -> 
        // Imagine that the domain classes know how to construct themselves from JOOQ autogenerated records
        CDomain c = new CDomain(r.c());
        ADomain a = new ADomain(r.a(), c);
        return a;
    );

【讨论】:

以上是关于无法将行转换为模型的主要内容,如果未能解决你的问题,请参考以下文章

将行转换为涉及日期的列

在 SQL 中使用“Pivot”将行转换为列

如何将行转换为按行数创建标题的列

MySQL - 根据每列的最新日期和 id 列表将行转换为列

使用 NHibernate 将行转换为属性/列

无法将 Keras 模型转换为 tflite