升级至Java17+Spring6+DataStax Driver4.17.0后PreparedStatement类型转换异常
解决ClassCastException:DefaultSimpleStatement无法转换为PreparedStatement
问题根源
你的代码中EntityMetaDataBasedQueryBinder.bindFindByIdQuery方法存在明显逻辑错误:QueryCache.findByIdStatement已经返回了PreparedStatement实例,但你却用String.valueOf()把它转成字符串,再通过SimpleStatement.newInstance()生成一个SimpleStatement对象,最后强行将其转换为PreparedStatement——这必然触发类型转换异常,因为SimpleStatement和PreparedStatement是两个完全独立的类,不存在继承或转换关系。
修复方案
直接移除多余的SimpleStatement.newInstance包装逻辑,直接使用QueryCache.findByIdStatement返回的PreparedStatement对象即可。修改后的代码如下:
public BoundStatement bindFindByIdQuery(Map<String, ? extends Object> ids, boolean refreshCache) { // 直接获取已准备好的PreparedStatement,无需额外包装 PreparedStatement statement = instance().findByIdStatement(entityMetaData, refreshCache); // 后续参数绑定逻辑保持原有实现即可 ... }
补充说明
QueryCache.findByIdStatement方法内部已经通过cassandraConfiguration.getSession(metaData).prepare()生成了合法的PreparedStatement,直接使用该对象就能正常执行参数绑定,生成可执行的BoundStatement,完全不需要额外的转换步骤。
内容的提问来源于stack exchange,提问作者Nayaz J H
相关产品推荐
相关产品推荐

