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 タイプの列は正常に動作します。しかし、この地図の地図は私にとってはうまくいきません。

これがサポートされていないのか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

0

OK、@phactが言ったことは、探していた答えではありませんが、物事を理解する道に私を導きました.

私の元の投稿に対する私自身のコメントによると、これはデータスタックス ドライバーの問題であり、問​​題ではないようspring-data-cassandraです。そして、datastax クライアントだけで問題のテーブルをクエリするための小さなテスト ハーネスを作成したときに、それが裏付けられました。v2.1.7.1 を選択cassandra-driver-coreし、マップのマップを使用してテーブルをクエリできました。

v1.3.0 がspring-data-cassandraもたらすドライバーのバージョンを見ると、古い v2.0.4 です。少しMaven依存関係のmalarkeyがありspring-data-cassandra、新しいdatastaxドライバーを使用してプロジェクトを作成しましたが、すべて正常に動作します。

于 2015-11-08T22:36:16.920 に答える