Spring Data Cassandra 和 Map of Maps

Spring Data Cassandra and Map of Maps

我有一个 Cassandra table 定义如下:

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)

我不知道 spring cassandra 框架位,您可以直接使用 datastax 驱动程序访问数据。

https://github.com/datastax/java-driver

我做了一些挖掘,spring 框架使用 java 驱动程序,因此必须有一个已经实例化的集群对象,如果 [= 未公开您需要的地图功能,您可以利用它18=]-卡桑德拉。可能会添加功能。

好吧,@phact 所说的并不是我要找的答案,但它确实让我走上了解决问题的道路。

根据我自己对原始 post 的评论,这似乎是一个 datastax 驱动程序问题,而不是 spring-data-cassandra 问题。当我编写一个小型测试工具来尝试查询 datastax 客户端的问题 table w/just 时,这一点得到了证实。我选择了 cassandra-driver-core 的 v2.1.7.1,并且能够很好地查询 table w/the 的地图。

查看 spring-data-cassandra 的 v1.3.0 引入的驱动程序版本较旧,v2.0.4。有点 maven 依赖问题,我的 spring-data-cassandra 项目使用更新的 datastax 驱动程序,一切正常。