You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Jooq中Joda DateTime映射为Java Instant类型的POJO

解决jOOQ中Joda DateTime转Java Instant的映射异常问题

针对你遇到的jOOQ fetchInto 转换时Joda DateTime 到Java Instant 的映射异常,有三种实用解决方案,按需选择:

1. 全局注册jOOQ转换器(推荐全局场景)

自定义一个实现jOOQ Converter 接口的转换类,注册到jOOQ的配置中,让fetchInto自动处理类型转换。

编写转换器类

import org.jooq.Converter;
import org.joda.time.DateTime;
import java.time.Instant;

public class DateTimeToInstantConverter implements Converter<DateTime, Instant> {
    @Override
    public Instant from(DateTime databaseObject) {
        return databaseObject != null ? databaseObject.toInstant() : null;
    }

    @Override
    public DateTime to(Instant userObject) {
        return userObject != null ? new DateTime(userObject) : null;
    }

    @Override
    public Class<DateTime> fromType() {
        return DateTime.class;
    }

    @Override
    public Class<Instant> toType() {
        return Instant.class;
    }
}

注册到jOOQ配置

// 初始化jOOQ配置并注册转换器
DefaultConfiguration config = new DefaultConfiguration();
// 全局注册该转换器,所有DateTime转Instant的场景都会生效
config.set(new DateTimeToInstantConverter());

// 或者针对特定类型匹配的转换器提供者(更灵活)
config.set(new ConverterProvider() {
    @Override
    public <T, U> Converter<T, U> provide(Class<T> fromType, Class<U> toType) {
        if (fromType == DateTime.class && toType == Instant.class) {
            return (Converter<T, U>) new DateTimeToInstantConverter();
        }
        return DefaultConverterProvider.INSTANCE.provide(fromType, toType);
    }
});

// 使用配置好的上下文执行查询
DSLContext dsl = DSL.using(config);
List<JsonConnector> connectors = dsl.selectFrom(CONNECTOR).fetchInto(JsonConnector.class);

2. 手动映射(适合小范围场景)

如果只需要在个别查询中处理转换,直接用fetch().map()手动逐个字段赋值,避免全局配置。

List<JsonConnector> connectors = dsl.selectFrom(CONNECTOR)
    .fetch()
    .map(record -> {
        JsonConnector jsonConnector = new JsonConnector();
        // 复制简单类型字段
        jsonConnector.setId(record.get(CONNECTOR.ID));
        jsonConnector.setName(record.get(CONNECTOR.NAME));
        // 处理DateTime到Instant的转换
        DateTime createTime = record.get(CONNECTOR.CREATE_TIME);
        jsonConnector.setCreateTime(createTime != null ? createTime.toInstant() : null);
        // 其他字段同理
        return jsonConnector;
    });

3. 使用MapStruct做对象转换(适合复杂对象场景)

如果两个POJO字段较多,用MapStruct自动生成转换代码,只需配置特定类型的转换逻辑。

定义MapStruct映射接口

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.joda.time.DateTime;
import java.time.Instant;

@Mapper(componentModel = "spring") // 若用Spring容器管理,否则用default
public interface ConnectorMapper {
    ConnectorMapper INSTANCE = org.mapstruct.Mappers.getMapper(ConnectorMapper.class);

    @Mapping(source = "createTime", target = "createTime", qualifiedByName = "dateTimeToInstant")
    JsonConnector toJsonConnector(CONNECTOR connector);

    @Named("dateTimeToInstant")
    default Instant dateTimeToInstant(DateTime dateTime) {
        return dateTime != null ? dateTime.toInstant() : null;
    }
}

执行转换

// 先查询到jOOQ生成的POJO列表
List<CONNECTOR> dbConnectors = dsl.selectFrom(CONNECTOR).fetchInto(CONNECTOR.class);
// 用MapStruct转换为JsonConnector
List<JsonConnector> jsonConnectors = dbConnectors.stream()
    .map(ConnectorMapper.INSTANCE::toJsonConnector)
    .collect(Collectors.toList());

内容的提问来源于stack exchange,提问作者deniro.wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:45:34