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 驱动程序,一切正常。
我有一个 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 驱动程序,一切正常。