2016-11-17 7 views
2

私はMapperでCassandraに保存したTupleデータ構造にアクセスしようとしています。しかし、私はできません。私はオンラインで例を見つけていません。Cassandra - JavaドライバでTupleのリストを解析できません

これは私が作成したテーブルとデータです。

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) 

マイマップされた(ビルダーのためにロンボクを使用して、ゲッター、セッター)クラス:

@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 {

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); 
} 
} 

私がデータにアクセスしようとしています以下のような試験方法で測定する:

@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"); 
     } 
    }); 

} 

ビット、私はタプルにアクセスすることができません。このエラーが発生します:

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のオブジェクトマッパーを使用してタプル値にアクセスするにはどうすればよいですか?

答えて

2

address_mappinglist<frozen<tuple<text,text>>>と定義されています。つまり、のリストは固定のタプル値です。これをMappingManagerに伝えるには、@FrozenValue attributeを使用します。

@Builder 
@Table(keyspace = "test", name = "test_nested") 
public class TestNested { 
    ... 

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

TestNestedは次のようになります。

関連する問題