Как конвертировать Cassandra UDT в Дополнительный тип

У меня есть таблица User и соответствующий ей POJO

@Table
public class User{
  @Column(name = "id")
  private String id; 

  // lots of fields

  @Column(name = "address")
  @Frozen
  private Optional<Address> address;   

  // getters and setters
}

@UDT
public class Address {
  @Field(name = "id")
  private String id;

  @Field(name = "country")
  private String country;

  @Field(name = "state")
  private String state;

  @Field(name = "district")
  private String district;

  @Field(name = "street")
  private String street;

  @Field(name = "city")
  private String city;

  @Field(name = "zip_code")
  private String zipCode;

  // getters and setters 
}

Я хочу конвертировать UDT "адрес" в опционально. Поскольку я использую "cassandra-driver-mapping:3.0.0-rc1" и "cassandra-driver-extras:3.0.0-rc1", я могу использовать их с большим количеством кодеков.

Например: OptionalCodec

Я хочу зарегистрировать его в CodecRegistry и передать TypeCodec в конструктор OptionalCodec.

Но TypeCodec - это абстрактный класс, я не могу его инициировать.

У кого-нибудь есть идеи, как инициировать OptionalCodec?


Спасибо, Оливье Михаллат. Ваше решение в порядке!

Но я немного запутался, чтобы установить OptionalCodec в CodecRegistry. Сначала вы должны начать сеанс. Затем передайте сессию в MappingManager, получите правильный TypeCodec и зарегистрируйте кодеки.

Немного странно, что сначала вы должны начать сеанс, чтобы получить TypeCodec!?

Cluster cluster = Cluster.builder()
                         .addContactPoints("127.0.0.1")
                         .build();
Session session = cluster.connect(...);
cluster.getConfiguration()
       .getCodecRegistry()
       .register(new OptionalCodec(new MappingManager(session).udtCodec(Address.class)))
       .register(...);
// use session to operate DB

2 ответа

MappingManager есть метод, который создаст кодек из аннотированного класса:

TypeCodec<Address> addressCodec = mappingManager.udtCodec(Address.class);
OptionalCodec<Address> optionalAddressCodec = new OptionalCodec(addressCodec);
codecRegistry.register(optionalAddressCodec);

Не совсем ответ, но надеюсь, что это поможет. я не мог сделать Optionalработа с UDT в scala. Однако Listа также Arrayработают нормально:

Вот scala-решение для драйвера версии 4.x:

      val reg = session.getContext.getCodecRegistry
val yourTypeUdt: UserDefinedType = session.getMetadata.getKeyspace(keyspace).flatMap(_.getUserDefinedType("YOUR_TYPE")).get
val yourTypeCodec: TypeCodec[UserDefinedType] = reg.codecFor(yourTypeUdt)
reg.asInstanceOf[MutableCodecRegistry].register(TypeCodecs.listOf(yourTypeCodec))

Не забудьте использовать java.util.*вместо ваших обычных типов scala.

Другие вопросы по тегам