当前位置: 首页 > 知识库问答 >
问题:

未使用datastax java driver 4.0.0对Cassandra列表进行反序列化

戚澄邈
2023-03-14

我目前正在进行一个新的项目,并选择了Cassandra作为我们的数据存储。我有一个用例,我存储材料的价格,为了实现它,我创建了用户定义类型(UDT)列表。但不幸的是,在使用datastax驱动程序进行反序列化时。在查询所需数据之后,我发现list对象为null,而在数据库中有它的值。这是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;
}

这就是我的UDT的样子:

  1. 在Cassandra数据库中:
CREATE TYPE pricingservice.volume_scale (
    from_scale int,
    to_scale int,
    value frozen<price_value>
);
@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的建议,我还尝试从java驱动程序本身使用对象映射器,但在使用ItemPriceByMaterialMapperBuilder创建对象时遇到了一个问题,即使用ItemPriceByMaterialMapperBuilder创建对象会引发编译错误。注释处理是否需要任何额外的东西,或者我遗漏了什么?你知道如何使用映射器注释吗?我也使用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);
    }

卡桑德拉:3.11.4

Spring Boot框架:2.2.4.发布

共有1个答案

东门修文
2023-03-14

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

您可以使用java驱动程序本身的对象映射器来代替Spring数据--它可能比Spring版本更优化。

 类似资料:
  • 问题内容: 尝试通过关联获取时,“字段列表”中出现未知列“ userDetails.createdAt”。 无需关联即可正常使用。 我的代码如下: 问题答案: 我认为错误是您在序列化中启用了时间戳,但是数据库中的实际表定义不包含时间戳列。 当您执行user.find时,它只会执行,而只接受您实际拥有的列。但是,当您联接时,联接表的每一列都将被别名,这将创建以下查询: 解决方法是禁用任一userDe

  • 我有这样一个实体: 和相关的JSON: 我试图在Spring MVC@Controller中以如下方式对其进行反序列化: 添加

  • 我有一个字段,它通过类序列化为ISO-8601格式。 当我收到以下JSON时, 通过将jackson-datatype-jsr310模块包含到项目中,并使用和解决了这个问题。

  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 问题内容: 我有一组三个列表项,它们希望在页面加载时从高到低自动显示。理想情况下使用jquery或javascript。 每个列表项都需要有自己的ID,因为它们每个都有各自的背景图像。数字必须是文本节点,以便用户可以编辑它们。 问题答案: 这可能是最快的方法,因为它不使用jQuery: 像下面这样调用函数: 您可以以相同的方式对其他列表进行排序,如果列表类在同一页面上还有其他元素,则应给您的ul一

  • 问题内容: 我使用杰克逊测试了Scala案例类的序列化。 DeserializeTest.java 福斯卡拉 当我运行上述Java类时,抛出了一个异常: 我如何(反)序列化Scala案例类? 问题答案: Jackson希望您的类是JavaBean,这意味着它希望该类的每个属性都具有getX()和/或setX()。 选项1 您可以使用注释BeanProperty在Scala中创建JavaBean类。