Spring Data Cassandra自动查询报InvalidQueryException:表未配置
Spring Data Cassandra 查询报错问题分析
问题场景
定义了如下Person实体类:
@Table("person_details") class Person{ @PrimaryKeyColumn(value = "person_id", type = PrimaryKeyType.PARTITIONED) private String personId; @Column(value = "age") private Integer age; public void setAge(Integer age){ this.age = age; } public Integer getAge(){ return age; } }
对应的仓库接口:
public interface PresonRepo extends CassandraRepository<Person, String>{ @AllowFiltering findAllByAgeGreaterThan(int age); }
执行findAllByAgeGreaterThan方法时抛出错误:
InvalidQueryException: unconfigured table person_details
日志显示自动生成的查询语句:
Preparing statement [SELECT * FROM "person_details" WHERE age>?
但使用@Query手动编写的查询却能正常执行:
@Query("select * from person_details where age >?0 ALLOW FILTERING") findByAgeGreaterThan (int age); //执行成功
使用的版本信息:
- cassandra driver - 4.15.0
- spring boot 2.7.7
- spring data cassandra 3.4.6
原因分析
核心问题在于自动生成的SQL里表名被添加了双引号"person_details",而手动编写的SQL没有加双引号。
在Cassandra中,带双引号的标识符会严格区分大小写,不带双引号的标识符则会自动转为小写(除非创建表时用双引号指定了大小写)。如果你的Cassandra实际表名是小写的person_details,那么带双引号的"person_details"会被Cassandra判定为不存在的表,从而抛出“未配置表”的错误。
Spring Data Cassandra默认会给自动生成查询里的表名、列名添加双引号,用于兼容大小写敏感的标识符场景,但如果你的表是小写创建的,就会出现匹配失败的问题。
解决办法
有两种可行的解决方式:
- 关闭标识符的引号转义
在Spring配置中添加以下配置,让自动生成SQL时不再添加双引号:
spring.data.cassandra.query.quote-identifiers=false
或者在Java配置类中设置:
@Configuration public class CassandraConfig extends AbstractCassandraConfiguration { // 其他配置项... @Override protected boolean getQuoteIdentifiers() { return false; } }
- 对齐实体类表名与实际表名的大小写
如果你的Cassandra表是用双引号创建的(比如CREATE TABLE "Person_Details" (...)),则需要调整实体类的@Table注解名称为对应大小写:
@Table("Person_Details") class Person { // ... }
补充说明
手动编写@Query时没有添加双引号,查询会自动匹配实际的小写表名,这就是手动查询成功而自动生成查询失败的根本原因。
内容的提问来源于stack exchange,提问作者Sreekanth P
相关产品推荐
相关产品推荐

