Ignite存储java.sql.Date后瘦客户端返回java.util.Date问题咨询
问题:Ignite瘦客户端查询返回java.util.Date而非定义的java.sql.Date
我需要在Ignite缓存中存储包含日期(如"2023-06-05")的数据,通过二进制对象构建并插入行数据。因为Ignite支持java.sql.Date类型,我用以下代码注册字段类型:
queryEntity.addQueryField(field, "java.sql.Date");
但使用瘦客户端查询数据时,返回的日期值却是java.util.Date类型,和表架构定义不一致。查询代码如下:
SqlFieldsQuery sql = new SqlFieldsQuery(queryString); try (QueryCursor<List<?>> cursor = cache.query(sql)) { for (List<?> row : cursor) { row.forEach(val -> { log.info(val.getClass().getName()); // 打印"java.util.Date" // 其他处理逻辑 }); } }
请问如何实现java.sql.Date类型的存储与查询?这是Ignite的预期行为吗?
解决方案与说明
这是Ignite瘦客户端的预期行为:瘦客户端的通信协议在处理日期类型的序列化/反序列化时,会统一将java.sql.Date映射为java.util.Date返回,即使表结构中定义的是java.sql.Date。
可以通过以下两种方式处理:
- 方法一:查询结果手动转换
在遍历查询结果时,将返回的java.util.Date显式转换为java.sql.Date:
row.forEach(val -> { if (val instanceof java.util.Date date) { java.sql.Date sqlDate = new java.sql.Date(date.getTime()); // 使用sqlDate进行后续业务处理 log.info(sqlDate.getClass().getName()); // 打印"java.sql.Date" } });
- 方法二:注册自定义类型转换器
通过Ignite客户端配置注册自定义的日期类型序列化/反序列化逻辑,让瘦客户端自动将返回值转换为java.sql.Date:
// 构建客户端配置 IgniteClientConfiguration cfg = new IgniteClientConfiguration(); cfg.setAddresses("127.0.0.1:10800"); // 注册java.sql.Date的类型转换器 ClientTypeConfiguration dateTypeCfg = new ClientTypeConfiguration(); dateTypeCfg.setTypeName("java.sql.Date"); dateTypeCfg.setSerializer((obj, out) -> { // 序列化:将java.sql.Date转为时间戳写入 out.writeLong(((java.sql.Date)obj).getTime()); }); dateTypeCfg.setDeserializer((in) -> { // 反序列化:读取时间戳转为java.sql.Date return new java.sql.Date(in.readLong()); }); cfg.getTypeConfigurations().add(dateTypeCfg); // 启动客户端并执行查询 try (IgniteClient client = Ignition.startClient(cfg)) { // 后续缓存查询操作 }
内容的提问来源于stack exchange,提问作者Vincent Y
相关产品推荐
相关产品推荐

