2017-01-16 7 views
1

Я использую datastax cassandra 3.1.0. Я создал следующую таблицу в cassandra и вставил запись.Cassandra mapper не обрабатывает CQLType Tuple

CREATE TABLE collect_things ( k int PRIMARY KEY, v frozen <tuple <int, text, double>>); 
INSERT INTO collect_things (k, v) VALUES(0, (3, 'bar', 2.1)); 
select * from collect_things ; 
k | v 
---+----------------- 
0 | (3, 'bar', 2.1) 

Когда я пытаюсь извлечь вышеуказанную строку в Java с использованием Cassandra Mapper на код ниже:

this.cluster = Cluster.builder().addContactPoint(node).withPort(port).build(); 
session = cluster.connect(); 
MappingManager manager = new MappingManager(session); 
Mapper<CollectThings> mapper = manager.mapper(CollectThings.class); 
Integer k = 0; 
mapper.get(k); 

Я получаю ниже исключение:

Exception in thread "main" com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [frozen<tuple<int, varchar, double>> <-> com.datastax.driver.core.TupleType] 
    at com.datastax.driver.core.exceptions.CodecNotFoundException.copy(CodecNotFoundException.java:56) 
    at com.datastax.driver.core.exceptions.CodecNotFoundException.copy(CodecNotFoundException.java:25) 
    at com.datastax.driver.mapping.DriverThrowables.propagateCause(DriverThrowables.java:41) 
    at com.datastax.driver.mapping.Mapper.get(Mapper.java:432) 

У меня есть после java bean для приведенной выше таблицы. CollectThings.java

import com.datastax.driver.core.TupleType; 
import com.datastax.driver.mapping.annotations.Frozen; 
import com.datastax.driver.mapping.annotations.PartitionKey; 
import com.datastax.driver.mapping.annotations.Table; 

@Table(keyspace = "user_info", name = "collect_things") 
public class CollectThings { 

    private Integer k; 
    private TupleType v; 

    public CollectThings() { 

    } 

    @PartitionKey 
    public Integer getK() { 
     return k; 
    } 

    public void setK(Integer k) { 
     this.k = k; 
    } 

    @Frozen 
    public TupleType getV() { 
     return v; 
    } 

    public void setV(TupleType v) { 
     this.v = v; 
    } 
} 

Может кто-нибудь, пожалуйста, как обращаться с типами кортежей здесь? Является ли mapper из коробки не поддерживать типы cql tuple?

ответ

3

Вы должны использовать TupleValue вместо TupleType. TupleType представляет информацию о типе для определенного кортежа, где TupleValue представляет фактическое значение. Используя ваш пример, я смог получить данные, изменив все ссылки TupleType на TupleValue.

+0

Это сработало. Я имел в виду использование TupleValue, но думал, что TupleValue не сможет обрабатывать все значения и представляет только одно значение из всего, у которого есть метод get() с индексом. Большое спасибо!! – Ravi

+0

Еще один вопрос, пожалуйста, вышесказанное прекрасно, когда вы извлекаете данные из db, но как насчет того, когда я хочу сохранить данные с помощью mapper. Как создать новый экземпляр TupleValue. Мой код похож: session.execute (mapper.saveQuery (bean)); Но для создания bean-компонента я не получаю никакого способа установить TupleValue v. – Ravi

+0

Чтобы создать TupleValue, вам нужен представитель TupleType. Вы можете получить это из Cluster.getMetadata(). NewTupleType (DataType.x ...) ;. Затем с помощью TupleType используйте newTupleValue для создания TupleValue из этого TupleType. –