无法将行转换为模型
Cannot convert row to model
使用 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)
);
classes 只是带有 getter、setter 的标准 POJO,用于上述值。
然后我有一个查询:
// 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))
Table 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
为什么会出现这个错误?为什么它试图从我的 class 转换为记录,而我要求它将记录转换为 class?我该如何解决这个问题?
我仍然不确定我的错误的确切根本原因,但我发现使用当前的 JOOQ(撰写本文时为 3.15),最容易使用 Record
s,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;
});
使用 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)
);
classes 只是带有 getter、setter 的标准 POJO,用于上述值。
然后我有一个查询:
// 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))
Table 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
为什么会出现这个错误?为什么它试图从我的 class 转换为记录,而我要求它将记录转换为 class?我该如何解决这个问题?
我仍然不确定我的错误的确切根本原因,但我发现使用当前的 JOOQ(撰写本文时为 3.15),最容易使用 Record
s,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;
});