我具有以下表结构,其中某些列是时间戳记:
CREATE TABLE `product_space` (
`ps_date_created` timestamp NULL DEFAULT NULL,
`ps_date_modified` timestamp NULL DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
//some other fields
)
我还有一个域类,它代表表中的一行,并将所有这些日期字段都包括为ZonedDateTime
:
@Data
@Builder
public class ProductSpace {
@Column(name = CREATED_AT)
private ZonedDateTime createdAt;
@Column(name = UPDATED_AT)
private ZonedDateTime updatedAt;
@Column(name = PS_DATE_CREATED)
private ZonedDateTime psDateCreated;
@Column(name = PS_DATE_MODIFIED)
private ZonedDateTime psDateModified;
//some other fields
}
然后我尝试运行以下查询:
Optional.ofNullable(
DSL.using(configuration)
.selectFrom(PRODUCT_SPACE_TABLE_NAME)
.where(field(GTIN, Long.class).eq(gtin))
.fetchAny())
.map(x -> x.into(ProductSpace.class));
哪个会产生异常:
org.jooq.exception.DataTypeException: Cannot convert from 1 (class org.jooq.types.ULong) to class java.time.ZonedDateTime
我需要保持域不变并且不更改字段类型,因此需要保留ZonedDateTime。但是,不知道如何解决该问题。
非常感谢您对此提供的任何帮助。
答案 0 :(得分:1)
jOOQ不支持ZonedDateTime
类型,因为JDBC中没有关于如何将其映射到基础SQL数据类型的规范。您必须手动映射类型:
Optional.ofNullable(DSL.using(configuration)
.selectFrom(PRODUCT_SPACE_TABLE_NAME)
.where(field(GTIN, Long.class).eq(gtin))
.fetchAny()
).map(x -> {
ProductSpace result = new ProductSpace();
result.setCreatedAt(myConversionFunction(x.get(PRODUCT_SPACE_TABLE_NAME.CREATED_AT)))
...
return result;
});
或者,您可以将上述RecordMapper
的lambda提取到可重用的RecordMapper
中,也可以定义自己的RecordMapperProvider
,它会覆盖默认值并在全局范围内实现此类型的映射:
https://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos-with-recordmapper-provider