【问题标题】:Spring Data Cassandra and Map of MapsSpring Data Cassandra 和 Maps 的地图
【发布时间】: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&lt;String&gt; 和非嵌套的 `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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-01-19
      • 2018-10-19
      • 2016-06-22
      • 2018-08-23
      • 2020-10-31
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多