Cassandra 映射器不处理 CQLType 元组
Cassandra mapper not handling CQLType Tuple
我正在使用 datastax cassandra 3.1.0。我在 cassandra 中创建了以下 table 并插入了一条记录。
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)
当我尝试使用带有以下代码的 Cassandra Mapper 在 Java 中获取上面的行时:
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)
对于上述 table,我有以下 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;
}
}
有人能告诉我如何在这里处理元组类型吗?开箱即用的映射器是否不支持 cql 元组类型?
您应该使用 TupleValue
而不是 TupleType
。 TupleType
表示特定元组的类型信息,其中 TupleValue
表示实际值。使用您的示例,我能够通过将 TupleType
的所有引用更改为 TupleValue
.
来检索数据
我正在使用 datastax cassandra 3.1.0。我在 cassandra 中创建了以下 table 并插入了一条记录。
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)
当我尝试使用带有以下代码的 Cassandra Mapper 在 Java 中获取上面的行时:
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)
对于上述 table,我有以下 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;
}
}
有人能告诉我如何在这里处理元组类型吗?开箱即用的映射器是否不支持 cql 元组类型?
您应该使用 TupleValue
而不是 TupleType
。 TupleType
表示特定元组的类型信息,其中 TupleValue
表示实际值。使用您的示例,我能够通过将 TupleType
的所有引用更改为 TupleValue
.