Cassandra读取Decimal类型值遇Codec not found错误,求解决方案
解决Cassandra Decimal类型读取报错:Codec not found for requested operation [decimal <-> java.lang.Double]
报错信息
Codec not found for requested operation [decimal <-> java.lang.Double]
问题原因
你在Cassandra中存储的是Decimal类型,但代码里试图用Long类型接收,二者类型不匹配;同时你错误注册了InstantCodec.decimal()——这个是处理时间类型的编解码器,和Decimal类型完全无关,两个问题叠加导致了编解码器找不到的报错。
解决方案
- 匹配对应类型:Cassandra的Decimal类型对应Java的
BigDecimal,而非Long或Double,读取时要保证类型一致 - 移除错误的编解码器注册:Cassandra Java驱动自带
BigDecimalCodec,默认就能处理Decimal类型,不需要额外注册错误的InstantCodec - 修改代码类型参数:把
getMap方法中的Long.class替换为BigDecimal.class
修改后的代码
cluster = Cluster.builder().addContactPoint("dev").withPort(9042).build(); // 移除错误的InstantCodec注册,无需额外操作即可处理Decimal类型 Select select = QueryBuilder.select().from("app"); session = cluster.connect(keyspace); ResultSet resultSet = session.execute(select); // 将Map的value类型从Long改为BigDecimal Map<String,Map<String,BigDecimal>> map = new HashMap<>(); resultSet.forEach(x -> map.put(x.getString("signal_name"), x.getMap("config", String.class, BigDecimal.class)));
内容的提问来源于stack exchange,提问作者sathish
相关产品推荐
相关产品推荐

