我有一张有田地的table
CREATE TABLE app_category_agg (
category text,
app_count int,
sp_count int,
subscriber_count int,
window_revenue bigint,
top_apps frozen <list<map<text,int>>>,
PRIMARY KEY (category)
);
当我试图把它Map到kotlin模型时
@Table("app_category_agg")
class AppCategoryAggData {
@PrimaryKeyColumn(name = "category", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
lateinit var category: String
@Column("app_count")
var appCount: Int = 0
@Column("sp_count")
var spCount: Int = 0
@Column("subscriber_count")
var subscriberCount: Int = 0
@Column("window_revenue")
var windowRevenue: Long = 0
@Column("top_apps")
var topApps: List<Any> = arrayListOf()
}
interface AppCategoryAggRepository: CassandraRepository<AppCategoryAggData, String> {
@Query(value = "SELECT * FROM analytics_info.app_category_agg")
fun findAllAppCategoryAggData(): List<AppCategoryAggData>
}
我得到这个错误
Query; CQL [SELECT * FROM analytics_info.app_category_agg]; Codec not found for requested operation: [map<varchar, int> <-> java.util.Map]; nested exception is com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [map<varchar, int> <-> java.util.Map]
我该怎么解决?我读过关于编解码器的书,但我不太清楚
1条答案
按热度按时间vaj7vani1#
我用您的结构创建了一个表,并用示例数据填充它:
对于java驱动程序3中的对象Map器,工作代码如下。
类别声明:
main函数-它首先插入kotlin代码中的数据,然后读取我预先插入的数据:
运行此代码时,我收到以下输出:
当我使用
cqlsh
,我看到数据是由kotlin插入的:完整的代码在我的存储库中。此解决方案的一个缺点是它基于java驱动程序3.x,后者是驱动程序的早期主要版本。如果您对它没有严格的要求,建议您使用最新的主要发行版-4.x,它同时适用于cassandra和dse,并具有许多新功能。
尽管新版本中的对象Map器的工作方式有所不同—使用的是编译注解,而不是运行时注解,因此代码看起来不同,我们需要以不同的方式配置编译过程,它可能比驱动程序3.x更复杂,但代码本身可能更简单(完整的代码在这里)。
我们需要定义数据类(实体):
用2个操作定义dao接口(
insert
以及findByCategory
):定义Map器以获取dao:
并使用它:
与java相比的变化是我们需要使用生成的类
AppCategoryMapperBuilder
获取示例AppCategoryMapper
在: