0

我有一个这样定义的 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();
}

不幸的是,这会引发异常。不那么时髦的列类型可以正常工作,例如,aList<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)
4

2 回答 2

3

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

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

我做了一些挖掘,spring 框架使用了 java 驱动程序,所以必须有一个集群对象已经实例化,如果你需要的地图功能没有被 spring-cassandra 公开,你可以利用它。可能会添加功能。

于 2015-11-08T16:52:21.907 回答
0

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

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

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

于 2015-11-08T22:36:16.920 回答