首页 文章

Spring Data Cassandra和 Map Map

提问于
浏览
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();
}

不幸的是,这引发了异常 . 不那么时髦的列类型工作正常,例如一个 List<String> 和非嵌套的`Map类型列工作正常 . 但是这张 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)

2 回答

  • 3

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

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

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

  • 0

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

    根据我对原始帖子的评论,似乎这是一个数据存储驱动程序问题,而不是 spring-data-cassandra 问题 . 当我编写一个小测试工具来尝试查询问题表时,只有数据存储客户端才能证明这一点 . 我选择了 cassandra-driver-core 的v2.1.7.1,并且能够很好地查询具有 Map 的 Map 的表格 .

    查看 spring-data-cassandra 的v1.3.0引入的驱动程序的版本是旧版本,v2.0.4 . 一点maven依赖malarkey和我使用更新的数据存储驱动程序 spring-data-cassandra 项目,一切正常 .

相关问题