2

Astyanaxバージョン1.56.26とCassandraバージョン1.2.2を使用しています

わかりました、少し状況の概要:

  1. 私は次のようにcqlshを使用して非常に単純な列ファミリーを作成しました。

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

  2. 列ファミリーにデータを入力しました(空の列はありません)

  3. userscqlshを介してクエリを実行すると、期待される結果が得られます

  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"次に、名前の付いた列の値を整数変数に割り当てようとしましたweightcolumns割り当ての直後にデバッグコードを追加すると、次のよう に変数が割り当てられることがわかります。

System.out.println("Column names = " + columns.getColumnNames());

次の出力が得られます。

Column names = [, age, weight]

では、なぜnullポインターなのですか?誰かが私がどこで間違ったのか教えてもらえますか?また、なぜ空白の列名があるのですか?

更新:
また、次のように別の方法でクエリを実行しようとすると、次のようになります。

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ステートメントを渡します。

AstyanaxでのCQLの使用に固有の情報は、ここにあります。

于 2013-03-07T06:44:08.743 に答える
0

setCqlVersionを追加することでこれを修正しました

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

WITH COMPACT STORAGEそして、テーブルの作成中に追加します。

于 2013-10-01T20:27:37.187 に答える