Spring Data Cassandra и карта карт

У меня есть таблица 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 для взаимодействия с ним. У меня есть ПОЖО:

@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> и не вложенные столбцы типа карты работают нормально. Но эта карта карт у меня не работает.

Интересно, нет ли поддержки для этого в 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)

person Jon Archer    schedule 08.11.2015    source источник
comment
Немного углубившись в отладку кода datastax, который выдает исключение, похоже, что класс TypeCodec не поддерживает карты чего-либо, кроме простых типов; см. метод `TypeCodec.mapOf(...) :( Предполагая, что я не могу изменить схему таблицы, какие-либо предложения о наилучшем способе доступа к этому столбцу из Java?   -  person Jon Archer    schedule 08.11.2015


Ответы (2)


Я не знаю о бите структуры spring cassandra, вы можете получить доступ к данным напрямую с помощью драйвера datastax.

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

Я немного покопался, и среда Spring использует драйвер java, поэтому должен быть уже создан экземпляр объекта кластера, который вы можете использовать, если нужные вам функции карт не предоставляются spring-cassandra. Вероятно, можно было бы добавить функционала.

person phact    schedule 08.11.2015

Хорошо, то, что сказал @phact, не является ответом, который я искал, но это поставило меня на путь выяснения вещей.

Согласно моему собственному комментарию к моему исходному сообщению, оказалось, что это проблема драйвера datastax, а не проблема spring-data-cassandra. И это подтвердилось, когда я написал небольшую тестовую программу, чтобы попытаться запросить таблицу проблем только с клиентом datastax. Я выбрал v2.1.7.1 из cassandra-driver-core и смог нормально запросить таблицу с картой карт.

Глядя на версию драйвера, которую v1.3.0 из spring-data-cassandra приносит, он старше, v2.0.4. Немного неправильной зависимости от maven, и у меня был проект spring-data-cassandra с использованием более нового драйвера datastax, и все работает нормально.

person Jon Archer    schedule 08.11.2015