繁体   English   中英

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

[英]Codec not found for requested operation [decimal <-> 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)));

您不需要弄乱编解码器。 发生此错误是因为 Cassandra DECIMAL类型不会将 map 转换为 Java Double

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

CREATE TABLE numerics (
    num INT PRIMARY KEY,
    dec DECIMAL,
    doub DOUBLE,
    flt FLOAT);

使用查询构建器,我可以像这样查询和 map 这些类型:

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;博士;

Cassandra DECIMAL类型映射到BigDecimal ,因此请尝试使用它。

Github 回购: https://github.com/aar0np/SelectNumerics

@sathish, 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 驱动程序4.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("-----------");
...

Output :

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

我希望这有帮助!


请将鼠标悬停在cassandra标签上,然后单击“ Watch tag ”按钮,支持 Apache Cassandra 社区。 谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM