找不到请求操作的编解码器 [十进制 <-> java.lang.Double]



我有十进制值在Cassandra db如何获得该值

cluster = Cluster.builder().addContactPoint("dev").withPort(9042).build();
cluster.getConfiguration().getCodecRegistry().register(InstantCodec.decimal());
Select select = QueryBuilder.select().from("app");
session = cluster.connect(keyspace);
ResultSet resultSet = session.execute(select);
Map<String,Map<String,Long>>map = new HashMap();
resultSet.forEach(x ->map.put(x.getString("signal_name"),x.getMap("config",String.class,Long.class)));

您不需要乱搞编解码器。出现此错误是因为CassandraDECIMAL类型没有映射到JavaDouble

假设有一个数字类型的表,如下所示:

CREATE TABLE numerics (
num INT PRIMARY KEY,
dec DECIMAL,
doub DOUBLE,
flt FLOAT);
使用查询生成器,我可以像这样查询和映射这些类型:
Select query = QueryBuilder.selectFrom("stackoverflow", "numerics")
.column("num")
.column("dec")
.column("doub")
.column("flt")
.whereColumn("num")
.isEqualTo(QueryBuilder.literal(1));
SimpleStatement statement = query.build();
ResultSet rs = session.execute(statement);
Row row = rs.one();

System.out.println("num(int) = " + row.getInt("num"));
System.out.println("decimal = " + row.getBigDecimal("dec"));
System.out.println("double = " + row.getDouble("doub"));
System.out.println("float = " + row.getFloat("flt"));

tl;博士;

一个CassandraDECIMAL类型映射到一个BigDecimal,所以尝试使用它。

Github repo: https://github.com/aar0np/SelectNumerics

decimalCQL数据类型映射到java类型的BigDecimal。详细信息请参见CQL到Java类型映射文档。

话虽如此,下面是我利用DataStax Astra DB的例子。为了证明这一点:

表结构:

CREATE TABLE ks.sodecimal (
i int PRIMARY KEY,
j decimal
);

:

token@cqlsh:ks> SELECT * FROM sodecimal ;
i | j
---+-------
1 | 0.124
(1 rows)

Java驱动程序:我使用的是DataStax Java Driver4.15.0版本,这是截至撰写本文时的最新版本。

...
System.out.println("-----------");
ResultSet rs_dec = session.execute("SELECT j FROM ks.sodecimal WHERE i = 1");
BigDecimal bd = rs_dec.one().getBigDecimal("j");
System.out.println("Decimal value: " + bd.toString());
System.out.println("-----------");
...

:

-----------
Decimal value: 0.124
-----------

相关内容