【发布时间】:2020-09-10 20:19:02
【问题描述】:
SELECT partition_int, clustering_int, value_string
FROM test_ks1.test WHERE partition_int = ? AND clustering_int IN ?
使用 in 子句准备的选择查询会引发以下异常:
java.lang.ClassCastException: class com.datastax.oss.driver.internal.core.type.PrimitiveType cannot be cast to class com.datastax.oss.driver.api.core.type.ListType
(com.datastax.oss.driver.internal.core.type.PrimitiveType and com.datastax.oss.driver.api.core.type.ListType are in unnamed module of loader 'app')
at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.inspectType(CachingCodecRegistry.java:343)
at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:256)
at com.datastax.oss.driver.internal.core.data.ValuesHelper.encodePreparedValues(ValuesHelper.java:112)
at com.datastax.oss.driver.internal.core.cql.DefaultPreparedStatement.bind(DefaultPreparedStatement.java:159)
使用 datastax oss 驱动程序 - 版本 4.5.1 和 cosmosDB。
查询使用 cassadra 作为 docker,并在 cqlsh 中使用 CosmosDB。
使用的查询:
CREATE TABLE IF NOT EXISTS test_ks1.test (partition_int int, value_string text, clustering_int int, PRIMARY KEY ((partition_int),clustering_int))- 准备声明:
INSERT INTO test_ks1.test (partition_int,clustering_int,value_string) values (?,?,?) - 插入值:1,1,”a” | 1,2,”b”
- 准备声明:
SELECT partition_int, clustering_int, value_string FROM test_ks1.test WHERE partition_int = ? AND clustering_int IN ? - 使用参数
1,List.of(1,2)执行 - 预期的参数是一个整数,而不是整数列表
选择准备语句的示例代码:
final CqlSessionBuilder sessionBuilder = CqlSession.builder()
.withConfigLoader(loadConfig(sessionConfig));
CqlSession session = sessionBuilder.build();
PreparedStatement statement = session.prepare(
"SELECT partition_int, clustering_int,"
+ "value_string FROM test_ks1.test WHERE partition_int = ? "
+ "AND clustering_int IN ?");
com.datastax.oss.driver.api.core.cql.ResultSet rs =
session.execute(statement.bind(1,List.of(1, 2)));
是否有一种解决方法可以将准备好的选择查询与 in 子句一起使用?
谢谢。
【问题讨论】:
-
你能展示你绑定变量的代码吗?
-
@AlexOtt 添加了带有绑定的示例代码。