Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
找不到请求操作的编解码器:[map<;varchar,int>;->;java.util.map];问题阿帕奇·卡桑德拉_Java_Kotlin_Cassandra_Datastax_Datastax Java Driver - Fatal编程技术网

找不到请求操作的编解码器:[map<;varchar,int>;->;java.util.map];问题阿帕奇·卡桑德拉

找不到请求操作的编解码器:[map<;varchar,int>;->;java.util.map];问题阿帕奇·卡桑德拉,java,kotlin,cassandra,datastax,datastax-java-driver,Java,Kotlin,Cassandra,Datastax,Datastax Java Driver,我有一张有田地的桌子 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) ); CREATE

我有一张有田地的桌子

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)
);
CREATE TABLE app\u category\u agg(
类别文本,
app_count int,
sp_计数整数,
用户计数整数,
窗口(收入),
顶级应用程序冻结,
主键(类别)
);
当我尝试将其映射到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>
}
@表格(“应用程序类别集合”)
类AppCategoryAggData{
@PrimaryKeyColumn(name=“category”,序号=0,类型=PrimaryKeyType.PARTITIONED)
lateinit变量类别:字符串
@列(“应用程序计数”)
变量appCount:Int=0
@列(“sp_计数”)
变量spCount:Int=0
@列(“订户计数”)
变量subscriberCount:Int=0
@列(“窗口收入”)
var windowRevenue:Long=0
@专栏(“热门应用程序”)
var topApps:List=arrayListOf()
}
接口AppCategoryAggRepository:CassandraRepository{
@查询(value=“SELECT*FROM analytics\u info.app\u category\u agg”)
fun findAllAppCategoryAggData():列表
}
我得到这个错误

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]
查询;CQL[从分析信息应用程序类别集合中选择*;找不到请求操作的编解码器:[map java.util.map];嵌套异常为com.datastax.driver.core.exceptions.codeconotfoundexception:未找到请求操作的编解码器:[map java.util.map]

我如何解决它?我读过关于制作编解码器的书,但我不太清楚

我用您的结构创建了一个表,并用示例数据填充了它:

insert into app_category_agg (category, app_count, sp_count, subscriber_count, window_revenue, top_apps) 
values('test', 2, 1, 10, 100, [{'t1':1, 't2':2}]);
对于Java驱动程序3中的对象映射器,工作代码如下

类别声明:

import com.datastax.driver.mapping.MappingManager
导入com.datastax.driver.mapping.annotations.Column
导入com.datastax.driver.mapping.annotations.PartitionKey
导入com.datastax.driver.mapping.annotations.Table
@表(keyspace=“test”,name=“app\u category\u agg”)
类AppCategoryAggData{
@分区键
lateinit变量类别:字符串
@列(name=“app\u count”)
变量appCount:Int=0
@列(name=“sp_计数”)
变量spCount:Int=0
@列(name=“订户数量”)
变量subscriberCount:Int=0
@列(name=“窗口收入”)
var windowRevenue:Long=0
@列(name=“top_应用程序”)
var topApps:List=emptyList()
重写funtostring():String{
return“AppCategoryAggData(category='$category',appCount=$appCount,spCount=$spCount,subscriberCount=$subscriberCount,windowRevenue=$windowRevenue,topApps=$topApps)”
}
}
主要功能-它首先从Kotlin代码中插入数据,然后读取我预先插入的数据:

import com.datastax.driver.core.Cluster
对象KtTestObjMapper{
@JvmStatic
趣味主线(args:Array){
val cluster=cluster.builder()
.addContactPoint(“10.101.34.176”)
.build()
val session=cluster.connect()
val管理器=映射管理器(会话)
val mapper=manager.mapper(AppCategoryAggData::class.java)
val appObj=AppCategoryAggData()
appObj.category=“kotlin”
appbj.appCount=5
appObj.spCount=10
appObj.subscriberCount=50
appObj.windowRevenue=10000
appObj.topApps=listOf(mapOf(“t2”到2))
mapper.save(appObj)
val obj2=mapper.get(“测试”)
打印(“obj2=$obj2”)
session.close()
cluster.close()
}
}
运行此代码时,我收到以下输出:

Object from =AppCategoryAggData(category='test', appCount=2, spCount=1, subscriberCount=10, windowRevenue=100, topApps=[{t1=1, t2=2}])
当我使用
cqlsh
从表中选择数据时,我看到数据是由Kotlin插入的:

cqlsh:test> SELECT * from app_category_agg ;

 category | app_count | sp_count | subscriber_count | top_apps             | window_revenue
----------+-----------+----------+------------------+----------------------+----------------
     test |         2 |        1 |               10 | [{'t1': 1, 't2': 2}] |            100
   kotlin |         5 |       10 |               50 |          [{'t2': 2}] |          10000

(2 rows)
这个。该解决方案的一个缺点是它基于Java驱动程序3.x,这是该驱动程序以前的主要版本。如果您对它没有严格的要求,建议使用最新的主要版本-4.x,它可以与Cassandra和DSE一起使用,并且具有许多新功能

虽然新版本中的对象映射器的工作方式有所不同,但使用的是编译注释,而不是运行时注释,因此代码看起来不同,我们需要这样做,而且代码本身可能更简单()

我们需要定义数据类():

@实体
@CqlName(“应用程序类别集合”)
数据类AppCategoryAggData(
@PartitionKey变量类别:字符串,
@CqlName(“应用程序计数”)变量appCount:Int?=null,
@CqlName(“sp_计数”)变量spCount:Int?=null,
@CqlName(“订户计数”)变量subscriberCount:Int?=null,
@CqlName(“窗口收入”)var windowRevenue:Long?=null,
@CqlName(“顶级应用程序”)var topApps:List?=null
) {
构造函数():此(“”)
}
有2个操作(
insert
findByCategory
):

@Dao
接口AppCategoryAggDao{
@插入
趣味插页(appCatAgg:AppCategoryAggData)
@挑选
有趣的findByCategory(appCat:String):AppCategoryAggData?
}
要获取DAO,请执行以下操作:

@Mapper
接口AppCategoryMapper{
@道场
有趣的appCategoryDao(@DaoKeyspace-keyspace:cklidentifier?):AppCategoryAggDao?
}
并使用它:

对象KtTestObjMapper{
@JvmStatic
趣味主线(args:Array){
val session=CqlSession.builder()
.addContactPoint(InetSocketAddress(“10.101.34.176”,9042))
.build()
//获取映射器-请注意,我们需要使用AppCategoryMapperBuilder
//由注释处理器生成的
val映射器:AppCategoryMapper=AppCategoryMappperBuilder(会话).build()
val dao:AppCategoryAggDao?=mapper.appCategoryDao(cklidentifier.fromCql(“测试”))
val appObj=AppCategoryAggData(“kotlin2”,
10, 11, 12, 34,
列表of(映射of(“t2”到2)))
dao?插入(APOBJ)
val obj2=dao?.findByCategory(“测试”)
println(“对象来源=$obj2”)
session.close()
}
}
与Java相比的变化是,我们需要使用生成的类
AppCategoryMapperBuilder