我正在使用Astyanax版本1.56.26和Cassandra版本1.2.2
好的,有点情况概述:
我使用cqlsh创建了一个非常简单的列族,如:
CREATE TABLE users (
name text PRIMARY KEY,
age int,
weight int
);
我填充了列系列(没有空列)
通过cqlsh查询users
会产生预期结果
现在我想以编程方式查询users
,所以我尝试了类似的内容:
ColumnFamily<String, String> users =
new ColumnFamily<String, String>("users", StringSerializer.get(), StringSerializer.get());
OperationResult<ColumnList<String>> result = ks.prepareQuery(users)
.getRow("bobbydigital") // valid rowkey
.execute();
ColumnList<String> columns = result.getResult();
int weight = columns.getColumnByName("weight").getIntegerValue();
weight
期间,NPE被抛出! :(我的理解是result
应该包含与包含"bobbydigital"
的行相关联的所有列作为其行键。然后,我尝试将名为"weight"
的列中的值分配给整数变量weight
。我知道变量columns
正在分配,因为当我在赋值后立即添加一些调试代码时,就像这样:
System.out.println("Column names = " + columns.getColumnNames());
我得到以下输出:
Column names = [, age, weight]
那么为什么空指针呢?谁能告诉我哪里出错了?另外,为什么有空白列名?
更新:
此外,如果我尝试以不同的方式查询,例如:
Column<String> result = ks.prepareQuery(users)
.getKey("bobbydigital")
.getColumn("weight")
.execute().getResult();
int x = result.getIntegerValue();
我得到以下例外:
InvalidRequestException(why:Not enough bytes to read value of component 0)
提前感谢您提供的任何帮助!
答案 0 :(得分:2)
我弄清楚我做错了什么。我尝试的查询样式对CQL表无效。要使用Astyanax查询CQL表,您需要将.withCQL
方法链接到prepareQuery
方法;传递CQL语句作为参数。
可以找到特定于使用CQL和Astyanax的信息here。
答案 1 :(得分:0)
我通过添加setCqlVersion
来解决这个问题 this.astyanaxContext = new AstyanaxContext.Builder()
.forCluster("ClusterName")
.forKeyspace(keyspace)
.withAstyanaxConfiguration(
new AstyanaxConfigurationImpl().setCqlVersion(
"3.0.0").setDiscoveryType(
在创建表时添加WITH COMPACT STORAGE
。