spring boot 使用 spring data redis 时,crudrepository 对布尔类型字段的查询方法(如 findbyactivefalse)可能返回空结果,根本原因是 redis 序列化后布尔值被存为字符串 "true"/"false",而默认查询机制无法自动匹配原始 boolean 类型参数。
在 Spring Data Redis 中,实体类的布尔字段(如 private boolean isActive;)经默认序列化器(如 JdkSerializationRedisSerialize

✅ 正确做法:将查询方法的参数改为 String 类型,并显式传入 "true" 或 "false" 字符串:
@Repository public interface StateDataCacheRepository extends CrudRepository{ // ✅ 推荐:按字符串值查询(匹配 Redis 中实际存储的内容) List findAllByActive(String active); // ✅ 可选:结合其他条件(如 deviceId) List findAllByActiveAndDeviceId(String active, String deviceId); }
调用示例:
// 查询所有 isActive = false 的记录 ListinactiveList = repository.findAllByActive("false"); // 查询指定设备且未激活的记录 List inactiveByDevice = repository.findAllByActiveAndDeviceId("false", "dev-001");
⚠️ 注意事项:
public ListfindInactiveByDeviceId(String deviceId) { return repository.findAllByActiveAndDeviceId("false", deviceId); }
? 总结:Spring Data Redis 的查询方法本质是基于 Redis Hash 结构的字段值匹配,而非 JPA 式的对象属性逻辑。由于序列化机制导致布尔值落地为字符串,查询必须与存储格式对齐——即统一使用 String 参数传 "true"/"false"。这是 Redis 键值存储特性与 Spring 抽象层交互时的关键适配点。