2016-11-17 6 views
2

나는 매퍼와 함께 카산드라에 저장된 튜플 데이터 구조에 액세스하려고합니다. 그러나, 나는 할 수 없다. 온라인에서 예제를 찾지 못했습니다.카산드라 - Java 드라이버와 튜플 목록을 구문 분석 할 수 없습니다.

이것은 내가 작성한 테이블 및 데이터입니다.

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 보일 것입니다