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 的样子:
- 在 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 引导框架: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。谢谢
我目前正在开发一个新项目,并选择了 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 的样子:
- 在 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 引导框架: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。谢谢