2

我正在使用 Astyanax 版本 1.56.26 和 Cassandra 版本 1.2.2

好的,一些情况概述:

  1. 我使用 cqlsh 创建了一个非常简单的列族,如下所示:

    CREATE TABLE users ( name text PRIMARY KEY, age int, weight int );

  2. 我填充了列族(没有空列)

  3. users通过 cqlsh查询产生预期结果

  4. 现在我想以编程方式查询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();
  1. 在分配weightNPE 的过程中被抛出!:(

我的理解是应该包含与包含作为其行键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)

提前感谢您提供的任何帮助!

4

2 回答 2

2

我弄清楚我做错了什么。我尝试的查询方式不适用于 CQL 表。要使用 Astyanax 查询 CQL 表,您需要将.withCQL方法链接到您的prepareQuery方法;将 CQL 语句作为参数传递。

可以在此处找到特定于将 CQL 与 Astyanax 结合使用的信息。

于 2013-03-07T06:44:08.743 回答
0

I got this fixed by adding setCqlVersion

this.astyanaxContext = new AstyanaxContext.Builder() .forCluster("ClusterName") .forKeyspace(keyspace) .withAstyanaxConfiguration( new AstyanaxConfigurationImpl().setCqlVersion( "3.0.0").setDiscoveryType(

And adding WITH COMPACT STORAGE while creating the table.

于 2013-10-01T20:27:37.187 回答