我有十进制值在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
,所以尝试使用它。
decimal
CQL数据类型映射到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
-----------