【发布时间】:2016-02-09 06:59:07
【问题描述】:
我有一个这样定义的 Cassandra 表:
create table foo (id int primary key, mapofmaps map<text, frozen<map<text, int>>>);
我在其中放置了一些数据:
insert into foo (id, mapofmaps) values (1, {'pets'; {'dog'; 42, 'cat'; 7}, 'foods': {'taco': 555, 'cake', '721'}});
然后我尝试使用spring-data-cassandra 与之交互。我有一个 POJO:
@Table
public class Foo {
@PrimaryKey
private Integer id;
@Column("mapofmaps")
private Map<String, Map<String, Integer>> mapOfMaps;
// getters/setters omitted for brevity
}
还有一个Repository:
public interface FooRepository extends CassandraRepository<Foo> {
}
然后下面的代码尝试检索所有记录作为一个简单的测试:
public Iterable<Foo> getAllFoos() {
return fooRepository.findAll();
}
不幸的是,这会引发异常。不那么时髦的列类型可以正常工作,例如List<String> 和非嵌套的 `Map 类型列工作正常。但是这张地图对我不起作用。
想知道spring-data-cassandra 中是否不支持此功能(尽管 DataStax 代码中似乎存在异常),或者我是否只需要对 POJO 做一些不同的事情。
抛出的异常如下:
Caused by: java.lang.NullPointerException: null
at com.datastax.driver.core.TypeCodec$MapCodec.deserialize(TypeCodec.java:821)
at com.datastax.driver.core.TypeCodec$MapCodec.deserialize(TypeCodec.java:775)
at com.datastax.driver.core.ArrayBackedRow.getMap(ArrayBackedRow.java:299)
at org.springframework.data.cassandra.convert.ColumnReader.get(ColumnReader.java:53)
【问题讨论】:
-
对引发异常的datastax代码进行更深入的调试,看起来
TypeCodec类不支持除了简单类型之外的任何映射;请参阅 `TypeCodec.mapOf(...) 方法 :( 假设我无法更改表架构,关于从 Java 访问此列的最佳方式有什么建议吗?
标签: spring cassandra datastax datastax-java-driver spring-data-cassandra