如何用@Query注解访问Cassandra主键类字段?报错解决
问题解决:Spring Data Cassandra中@Query访问主键类字段报错
错误原因分析
你遇到的"Could not find field for property during fallback access!"报错,主要由以下几个问题导致:
- CQL查询语法错误:原查询中使用
key.EMP_ID是错误的,CQL直接操作Cassandra表的列名,而非实体类的嵌套属性路径;同时语句末尾缺少闭合引号和括号,引发解析失败。 - 主键类ordinal重复:三个主键列的
ordinal都设为0,导致Cassandra无法正确识别主键的逻辑顺序,破坏了主键结构的映射关系。 - 返回类型不匹配:仅查询
EMP_ID字段,但返回Mono<KeyValuePair>,若KeyValuePair未正确映射该字段,会导致结果绑定失败。
修正步骤
1. 修正主键类的ordinal值
主键列的ordinal需按顺序设置,分区键和聚类键不能重复:
@PrimaryKeyClass public class CassandraPrimaryKeyclass implements Serializable { @PrimaryKeyColumn(name = "KEY_NAME", ordinal = 0, type = PrimaryKeyType.PARTITIONED) public String serviceKeyName; @PrimaryKeyColumn(name = "KEY_VALUE", ordinal = 1, type = PrimaryKeyType.PARTITIONED) public String serviceKeyValue; @PrimaryKeyColumn(name ="EMP_ID",ordinal = 2, type = PrimaryKeyType.CLUSTERED) public String empID; }
2. 修正Repository的@Query语句
直接使用Cassandra表的列名,同时修复语法错误,并匹配正确的返回类型:
- 如果仅需要返回
EMP_ID的值,调整返回类型为Mono<String>:
@Query("select EMP_ID from table1 WHERE KEY_NAME=?0 AND KEY_VALUE=?1") public Mono<String> parallelMultiReadKeyValue(String serviceKeyName, String serviceKeyValue);
- 如果必须返回
KeyValuePair,需确保该类正确映射查询字段:
// 自定义KeyValuePair类,添加字段映射 @Data public class KeyValuePair { @Column("EMP_ID") private String empId; } // Repository层代码 @Query("select EMP_ID from table1 WHERE KEY_NAME=?0 AND KEY_VALUE=?1") public Mono<KeyValuePair> parallelMultiReadKeyValue(String serviceKeyName, String serviceKeyValue);
内容的提问来源于stack exchange,提问作者Ramya
相关产品推荐
相关产品推荐

