转换日期时出现异常
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 中将其转换为日期时出现问题