You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:06:06