Spring Boot Redis中CrudRepository布尔字段查询失效问题
问题解决:Spring Data Redis 布尔字段筛选返回空数组
问题根源
实体类中布尔字段命名为isActive,但Repository查询方法使用Active作为属性名,Spring Data Redis解析查询条件时,会将Active对应到实体类的active属性,而非实际的isActive字段,导致无法匹配Redis中存储的数据。
解决方案
方案1:修正Repository方法命名,匹配实体类字段名
将查询方法中的Active改为IsActive,对应实体类的isActive字段:
@Repository public interface StateDataCacheRepository extends CrudRepository<StateDataCache, String> { List<StateDataCache> findAllByIsActiveFalseAndDeviceId(String deviceId); List<StateDataCache> findAllByIsActiveIs(boolean sent); List<StateDataCache> findAllByIsActiveFalse(); }
方案2:调整实体类字段名,符合JavaBean规范
将实体类的布尔字段改为active(去掉is前缀),避免命名歧义:
@Data @Builder @NoArgsConstructor @AllArgsConstructor @RedisHash("StateData") public class StateDataCache implements Serializable { @Id String id; private String deviceId; private String topic; private String message; private String lat; private String lon; private boolean active; // 去掉is前缀 }
此时原Repository的方法命名即可正常工作。
方案3:使用@Field注解指定Redis存储字段名
如果需要保留实体类isActive字段名,同时让查询方法使用Active,可以通过@Field指定Redis中存储的字段名:
@Data @Builder @NoArgsConstructor @AllArgsConstructor @RedisHash("StateData") public class StateDataCache implements Serializable { @Id String id; private String deviceId; private String topic; private String message; private String lat; private String lon; @Field("isActive") // 指定Redis中存储的字段名 private boolean active; }
验证步骤
使用Redis CLI执行HGETALL StateData:{id}命令,查看存储的字段名,确认查询条件中的属性名与Redis实际存储的字段名一致,即可排查匹配问题。
内容的提问来源于stack exchange,提问作者gurkan
相关产品推荐
相关产品推荐

