如何通过Datastax驱动将元组集合存入Cassandra数据库
Micronaut集成Cassandra存储元组集合报错解决方案
报错的核心原因是Java版Cassandra驱动无法直接识别传入literal()方法的Set<Tuple> Java集合类型,无法自动完成Java集合到CQL的set<tuple<...>>类型的映射。
以下是两种无需自定义TypeCodec的实现方案:
方案1:预编译绑定参数(生产环境首选)
不要用literal()硬编码值到CQL语句中,改用占位符绑定参数的方式执行插入,驱动会自动根据表结构的列类型处理类型映射:
// 1. 构造带占位符的插入语句 val insert = QueryBuilder.insertInto(table) .value("column", QueryBuilder.bindMarker()) .build() // 2. 预编译语句后绑定值执行 val preparedStmt = session.prepare(insert) val boundStmt = preparedStmt.bind() .setSet("column", items.map { it.toTupleValue() }.toSet()) session.execute(boundStmt)
注意这里的toTupleValue()需要返回驱动原生的TupleValue对象,而非Term类型,绑定参数时可以直接被驱动识别。
方案2:QueryBuilder原生集合方法构造Term(适合需要硬编码字面量的场景)
不需要把整个Set传入literal(),直接用QueryBuilder提供的set()方法构造集合类型的Term,会自动拼接为CQL识别的集合字面量:
QueryBuilder .insertInto(table) .value( "column", // 把所有Tuple Term传入QueryBuilder.set()构造集合Term,*为Kotlin数组展开运算符 QueryBuilder.set(*items.map { it.toTuple() }.toTypedArray()) )
内容的提问来源于stack exchange,提问作者Yonatan Karp-Rudin
相关产品推荐
相关产品推荐

