转换日期时发生异常

时间:2018-06-20 10:24:27

标签: java jpa jooq

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

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

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

1 个答案:

答案 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