如何将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
相关产品推荐
相关产品推荐

