【发布时间】: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
【问题讨论】:
标签: datastax cassandra-3.0 datastax-java-driver spring-data-cassandra