首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Cassandra -无法使用Java驱动程序解析元组列表

Cassandra -无法使用Java驱动程序解析元组列表
EN

Stack Overflow用户
提问于 2016-11-18 01:29:11
回答 1查看 1.2K关注 0票数 3

我正在尝试使用Mapper访问存储在Cassandra中的元组数据结构。但是,我不能。我还没有在网上找到任何例子。

这是我创建的表和数据。

代码语言:javascript
复制
cqlsh:test> CREATE TABLE test.test_nested (id varchar PRIMARY KEY, address_mapping list<frozen<tuple<text,text>>>);
cqlsh:test> INSERT INTO test.test_nested (id, address_mapping) VALUES ('12345', [('Adress 1', 'pin1'), ('Adress 2', 'pin2')]);
cqlsh:test>
cqlsh:test> select * from test.test_nested;

id    | address_mapping
-------+----------------------------------------------
12345 | [('Adress 1', 'pin1'), ('Adress 2', 'pin2')]

(1 rows)

我的映射类(使用lombok作为builder、getter、setter):

代码语言:javascript
复制
@Builder
@Table(keyspace = "test", name = "test_nested")
public class TestNested {

    @PartitionKey
    @Column(name = "id")
    @Getter
    @Setter
    private String id;

    @Column(name = "address_mapping")
    @Frozen
    @Getter
    @Setter
    private List<Object> address_mapping;
}

我的映射器类:公共类TestNestedStore {

代码语言:javascript
复制
private final Mapper<TestNested> mapper;

public TestNestedStore(Mapper<TestNested> mapper) {
    this.mapper = mapper;
}


public void insert(TestNested userDropData) {
    mapper.save(userDropData);
}


public void remove(String id) {
    mapper.delete(id);
}

public TestNested findByUserId(String id) {
    return mapper.get(id);
}

public ListenableFuture<TestNested> findByUserIdAsync(String id) {
    return mapper.getAsync(id);
}
}

我正在尝试使用测试方法访问数据,如下所示:

代码语言:javascript
复制
    @Test
public void testConnection2(){

    MappingManager manager = new MappingManager(scyllaDBConnector.getSession());
    Mapper<TestNested> mapper = manager.mapper(TestNested.class);

    TestNestedStore testNestedStore = new TestNestedStore(mapper);

    ListenableFuture<TestNested> fut = testNestedStore.findByUserIdAsync("12345");
    Futures.addCallback(fut, new FutureCallback<TestNested>() {

        @Override
        public void onSuccess(TestNested testNested) {

        }

        @Override
        public void onFailure(Throwable throwable) {

            System.out.println("Call failed");
        }
    });

}

位,我无法访问元组。我得到了这个错误:

代码语言:javascript
复制
java.lang.IllegalArgumentException: Error while checking frozen types on field address_mapping of entity com.example.model.TestNested: expected List to be not frozen but was frozen

at com.datastax.driver.mapping.AnnotationChecks.validateAnnotations(AnnotationChecks.java:73)
at com.datastax.driver.mapping.AnnotationParser.parseEntity(AnnotationParser.java:81)
at com.datastax.driver.mapping.MappingManager.getMapper(MappingManager.java:148)
at com.datastax.driver.mapping.MappingManager.mapper(MappingManager.java:105)

我也尝试过使用private List<TupleValue> address_mapping;。但是没用!

如何通过cassandra的对象映射器访问元组值?

EN

回答 1

Stack Overflow用户

发布于 2017-11-01 02:53:36

您可以将address_mapping定义为list<frozen<tuple<text,text>>>,即冻结的元组值的列表。要将此信息传递给MappingManager,您可以使用@FrozenValue attribute

TestNested应该如下所示:

代码语言:javascript
复制
@Builder
@Table(keyspace = "test", name = "test_nested")
public class TestNested {
    ...

    @Column(name = "address_mapping")
    @Frozen
    @Getter
    @Setter
    @FrozenValue
    private List<Object> address_mapping;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40661390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档