为何Cassandra客户端查询有结果,Java Repository执行同查询却返回Null?
可能的原因及排查方向
实体类与返回类型不匹配:你的Repository是基于
Emps实体定义的,但查询方法返回的是SpinResult类型。Cassandra无法将emps表的查询结果映射到不匹配的实体类,直接返回null。应该把返回类型改成Emps或者Optional<Emps>。字段映射错误:检查
Emps实体中causality字段的定义:- 列名是否和数据库一致?如果数据库列名是小写
causality,但实体字段是大写或驼峰式,需要添加@Column("causality")注解明确指定列名。 - 类型是否匹配?如果数据库中
causality是UUID类型,实体字段却用String,需要将字段类型改为UUID,或者确保驱动能正确完成字符串到UUID的转换。
- 列名是否和数据库一致?如果数据库列名是小写
查询缺少ALLOW FILTERING(如果causality不是分区键):如果
causality不是表的分区键,直接执行select * from emps where causality = ?会被Cassandra拒绝,但有些客户端会自动添加ALLOW FILTERING。可以尝试在Java查询中显式添加:@Query("select * from emps where causality = :causality ALLOW FILTERING")参数绑定的类型问题:确认传入的
causality参数是否和数据库存储的类型完全一致。比如数据库存储的是UUID,而你传入的字符串有多余空格、格式错误,部分驱动可能无法自动兼容这类差异。一致性级别设置差异:Java客户端的读一致性级别可能和你使用的Cassandra客户端不同。比如Java用了
LOCAL_ONE,而数据仅同步到了其他节点,导致读不到;而客户端用了LOCAL_QUORUM能读到。可以检查Java配置中的一致性级别设置。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

