1

文字列を持つ列ファミリーと、列名の複合型があります。

行を ByteBuffers の ColumnList として取得する場合、適切なシリアライザーを使用するには、列の型を知る必要があります。タイプを取得する方法はありますか、それとも別の方法で行う必要がありますか?

コード:

ColumnFamily<String, ByteBuffer> cfBytes =  ColumnFamily.newColumnFamily("mycolumnfamily",StringSerializer.get(), ByteBufferSerializer.get());

ColumnFamilyQuery<String, ByteBuffer> cfq = keyspace.prepareQuery(cfBytes);

RowQuery<String, ByteBuffer> rowQuery = cfq.getKey("foobar");

ColumnList<ByteBuffer> result = rowQuery.execute().getResult();
4

2 に答える 2

0

単一の行を取得している場合は、複合列のタイプを知ることができます:

// Query the composite columns
@SuppressWarnings("rawtypes")
OperationResult<ColumnList<ColumnFamily>> result = null;
try {
    result = oKeyspace.getKeyspaceContext().
             getEntity().prepareQuery(compTestCF).getRow("12345").execute();
} catch (ConnectionException e1) {
    e1.printStackTrace();
}
for (@SuppressWarnings("rawtypes")
Column<ColumnFamily> col : result.getResult()) {
    String colClass = ((Object) col.getName()).getClass().getName();
    if (colClass.equals(CompositeColumn.class.getName())) {
    System.out.println(col.getLongValue());
    }
}       

上記のように、私の複合列テスト クラスの名前は CompositeColumn です。これが機能する理由は、OperationResult がColumnList<ColumnFamily>オブジェクトであるためです。各Column<ColumnFamily>オブジェクトには複合列オブジェクトが名前として含まれているため、CompositeColumn クラス名を見つけることができます。これができるのは、「getRow」または「getKey」呼び出しの結果が RowQuery オブジェクトであるためです。

残念ながら、複数の行が返されたときにこれを行う方法が見つかりませんでした。その場合、ColumnList<ColumnFamily>行ごとにオブジェクトが生成されることはなく、代わりにColumnList<Object>オブジェクトが生成されます。これは、スライスまたは範囲のクエリの結果が RowSliceQuery オブジェクトであり、なんらかの理由で同じ機能が得られないためです。col.getName() 呼び出しは、複合列に対して空の文字列を返します。

于 2012-12-20T20:40:25.987 に答える
0

一般的な複合列の場合は、Composite型またはMockComposite型のみを使用できます。次に例を示します。

ColumnFamily<String, MockCompositeType> CF_COMPOSITE = 
    ColumnFamily.newColumnFamily("CompositeColumn", StringSerializer.get(),
        new AnnotatedCompositeSerializer<MockCompositeType>(MockCompositeType.class));

詳細については、こちらのリンクを参照してください

または、純粋な Astyanax を作成するための代替手段はPlayORMです。

于 2012-12-12T13:03:01.247 に答える