Как конвертировать 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.