转换日期时出现异常

Posted

技术标签:

【中文标题】转换日期时出现异常【英文标题】:Exception while converting dates 【发布时间】:2018-11-29 10:52:53 【问题描述】:

我有以下表结构,其中一些列是时间戳

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

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

【问题讨论】:

使用的是哪个版本? @JacekCz 3.10.4 什么 JPA 提供者和什么版本? 【参考方案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

【讨论】:

以上是关于转换日期时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

将德国日期转换为美国日期时出现 DateTime.TryParse() 问题

将时间戳转换为特定时区然后在 bigquery 中将其转换为日期时出现问题

使用地图转换消息时出现 Biztalk 2020 异常

将字符串转换为短 C# 时出现格式异常

将python代码转换为c ++时出现opencvcornerSubPix异常

将 Geopoint 转换为 Location 时出现空指针异常