【发布时间】: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,然后根据需要应用翻译来解决了这个问题。 -
酷。你可以在这里回答你自己的问题,所以也许将来有人会发现它有用。