3

我有一个用户表及其对应的 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”,所以我可以使用很多编解码器。

例如:可选编解码器

我想将它注册到 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
4

2 回答 2

5

MappingManager一个方法可以从带注释的类创建编解码器:

TypeCodec<Address> addressCodec = mappingManager.udtCodec(Address.class);
OptionalCodec<Address> optionalAddressCodec = new OptionalCodec(addressCodec);
codecRegistry.register(optionalAddressCodec);
于 2016-01-11T13:45:57.987 回答
0

不是一个真正的答案,但希望它有所帮助。我无法Optional在 scala 中使用 UDT。但是List并且Array工作正常:

这是驱动程序版本 4.x 的 scala 解决方案:

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 类型。

于 2022-02-10T20:13:48.317 回答