如何将Cassandra UDT转换为Optional类型

pan*_*rme 3 cassandra cassandra-jdbc

我有一个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 
}
Run Code Online (Sandbox Code Playgroud)

我想将UDT"地址"转换为可选.因为我使用"cassandra-driver-mapping:3.0.0-rc1"和"cassandra-driver-extras:3.0.0-rc1",所以我可以使用很多编解码器.

例如:OptionalCodec

我想将它注册到CodecRegistry并将TypeCodec传递给OptionalCodec的构造函数.

但TypeCodec是一个抽象类,我无法启动它.

有人知道如何启动OptionalCodec?


谢谢你,@ Olivier Michallat.你的解决方案没问题!

但我有点困惑,将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
Run Code Online (Sandbox Code Playgroud)

Oli*_*lat 5

MappingManager有将创建一个从注释类的编解码器的方法:

TypeCodec<Address> addressCodec = mappingManager.udtCodec(Address.class);
OptionalCodec<Address> optionalAddressCodec = new OptionalCodec(addressCodec);
codecRegistry.register(optionalAddressCodec);
Run Code Online (Sandbox Code Playgroud)