我具有以下表结构,其中某些列是时间戳记:

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。但是,不知道如何解决该问题。

非常感谢您对此提供的任何帮助。

最佳答案

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

09-11 05:28