Cassandra List<UDT> 未使用 datastax java driver 4.0.0 反序列化

Posted

技术标签:

【中文标题】Cassandra List<UDT> 未使用 datastax java driver 4.0.0 反序列化【英文标题】:Cassandra List<UDT> not getting deserialized using datastax java driver 4.0.0 【发布时间】:2020-07-14 04:52:26 【问题描述】:

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

这就是我的简化实体(表格)的样子:

    @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;

所以我在数据库选择查询后将 volumeScale1 设为 null。

这就是我的 UDT 的样子:

    在 Cassandra 数据库中:
CREATE TYPE pricingservice.volume_scale (
    from_scale int,
    to_scale int,
    value frozen<price_value>
);
    作为 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 Boot 框架:2.2.4.RELEASE

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢您的建议@Alex。我会试试的。 嗨,Alex,我尝试了“来自 java 驱动程序本身的对象映射器”,但在注释处理期间生成的类之一是 InventoryMapperBuilder 没有生成或者我遗漏了一些东西时卡住了,做你有什么想法。我也使用 google AutoService 来实现这一点。【参考方案2】:

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

【讨论】:

以上是关于Cassandra List<UDT> 未使用 datastax java driver 4.0.0 反序列化的主要内容,如果未能解决你的问题,请参考以下文章

Collections$UnmodifiableRandomAccessList<E> Cassandra Frozen Map

通过 Spark SQL 查询 Cassandra UDT

Cassandra 中的用户定义类型 (UDT) 行为

无法使用 datastax java 驱动程序通过 UDT 键从 cassandra 检索

Spark Cassandra 使用区分大小写的名称写入 UDT 失败

TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType