3

我试图在 cassandra 中插入一个 longtype 列:

     Column docid = new Column();        
     docid.setName("docid".getBytes());      
     ByteBuffer val = ByteBuffer.allocate(8);
     val.putLong(123111111111111111L);
     docid.setValue(val);
     docid.setTimestamp(System.currentTimeMillis());
     client.insert(term, parent, docid, ConsistencyLevel.ONE);

它运行正常,但是当我尝试通过 CLI 获取值时,它返回

[default@Test] get Term[utf8('hello')]['docid'] as long;
=> (column=docid, value=, timestamp=1362891987234)

似乎没有正确插入值。为什么?

我尝试插入 ascii 类型并且它有效。

4

2 回答 2

0

也许您已经找到了解决方案,或者您切换到了 CQL,但这会有所帮助:

将 long 值放入 ByteBuffer 后,您忘记了对其进行翻转()。正如 javadoc 中所解释的,翻转缓冲区意味着将限制设置为当前位置,然后将当前位置设置为零

如果您不翻转它,则从当前位置开始读取包含的值(就在您插入的字节之后),这就是为什么当您查询它时“值”为空的原因。

这是固定代码:

val.putLong(123111111111111111L);
val.flip(); // Flip the buffer
docid.setValue(val);

编辑 :

val.array()返回 ByteBuffer 的内部数组,因此不是翻转缓冲区,而是将列的值设置为val.array()也可以工作(但前提不直接分配字节缓冲区)

于 2013-09-11T09:32:17.373 回答
0

改变:

docid.setValue(val);

至:

docid.setValue(val.array());
于 2013-03-11T00:18:20.123 回答