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 Column,您可以只使用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 回答