Cassandra List<UDT> 未使用 datastax java 驱动程序 4.0.0 进行反序列化

Cassandra List<UDT> not getting deserialized using datastax java driver 4.0.0

我目前正在开发一个新项目,并选择了 Cassandra 作为我们的数据存储。 我有一个用例,我存储了 material 的价格,为了完成它,我创建了用户定义类型 (UDT) 列表。但不幸的是,在使用 datastax 驱动程序进行反序列化时。查询所需数据后,发现列表对象为空,而在数据库中有值。这是 Cassandra java 驱动程序的当前限制还是我遗漏了什么?

这是我的简化实体 (table) 的样子:

    @PrimaryKeyColumn(name = "tenant_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private long tenantId;
    @PrimaryKeyColumn(name = "item_id", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
    private String itemId;
    @CassandraType(type = DataType.Name.LIST, userTypeName = "volume_scale_1")
    private List<VolumeScale> volumeScale1;
}

所以我在数据库 select 查询后得到的 volumeScale1 为空。

这就是我的 UDT 的样子:

  1. 在 Cassandra 数据库中:
CREATE TYPE pricingservice.volume_scale (
    from_scale int,
    to_scale int,
    value frozen<price_value>
);
  1. 作为 java 中的 UDT:
@UserDefinedType("volume_scale")
public class VolumeScale
{  
   @CassandraType(type = DataType.Name.TEXT, userTypeName = "from_scale")
   @Column("from_scale")
   private String fromScale;

   @CassandraType(type = DataType.Name.TEXT, userTypeName = "to_scale")
   @Column("to_scale")
   private String toScale;
   @CassandraType(type = DataType.Name.UDT, userTypeName = "value")
   private PriceValue value;
   // getter and setter
}

我也尝试根据@Alex 的建议使用 Object Mapper from java driver itself,但卡在了使用 ItemPriceByMaterialMapperBuilder 创建对象抛出编译错误的某一点。注释处理是否需要任何额外的东西,或者我是否遗漏了什么?你知道如何使用 Mapper 注释吗?我也使用了google AutoService 来实现外部的注解处理,但是没有用。


    @Mapper
    //@AutoService(Processor.class)
    public interface ItemPriceByMaterialMapper
    // extends Processor
    {
        static MapperBuilder<ItemPriceByMaterialMapper> builder(CqlSession session) {
            return new ItemPriceByMaterialMapperBuilder(session);
          }

        @DaoFactory
        ItemPriceByMaterialDao itemPriceByMaterialDao ();

        // @DaoFactory
        // ItemPriceByMaterialDao itemPriceByMaterialDao(@DaoKeyspace CqlIdentifier
        // keyspace);
    }

使用的版本:

Java版本:1.8

DataStax OSS java-driver-mapper-processor: 4.5.1

DataStax OSS java-driver-mapper-runtime: 4.5.1

卡桑德拉:3.11.4

Spring 引导框架:2.2.4.RELEASE

据我了解,您有多个问题:如果您使用的是 Spring Data Cassandra,那么您将获得较旧的驱动程序(3.7.2 for Spring 2.2.6-RELEASE ),并且它可能与您尝试使用的驱动程序 4.0.0(它太旧,请勿使用)发生冲突。驱动程序 4.x 与以前的驱动程序不二进制兼容,它在 Spring Data Cassandra 中的支持可能 仅在 Spring 的下一个主要版本中.

您可以使用 Object Mapper from java driver itself 代替 Spring 数据 - 它可能比 Spring 版本更优化。

我决定不使用对象映射器,而是使用 Spring Data Cassandra 和 Spring 2.2.6-RELEASE。谢谢