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

Spring Data Redis中Repository的findBy方法无法正常工作

解决spring-data-redis 2.7.5按字段查询返回空数组的问题

针对你遇到的findByAppType返回空数组(数据库存在匹配数据),且添加@Indexed无效的情况,按以下步骤排查解决:

1. 确保@Indexed注解正确使用并重建索引

  • 必须将@Indexed标注在appType字段上:
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @RedisHash("Applications")
    public class Applications implements Serializable {
        private String appName;
        @Indexed // 标注在需要索引的字段上
        private String appType;
        @Id
        private String appId;
    }
    
  • 注意:添加@Indexed前已存在的Redis数据不会自动生成索引,需要重新插入这些数据,或调用applicationRepository.save(现有实体)触发索引创建。

2. 检查Redis中的索引结构

用Redis客户端执行以下命令验证索引是否存在:

  • 查看指定实体的完整数据:HGETALL Applications:你的appId,确认数据中appType值正确
  • 查看对应appType的索引集合:SMEMBERS Applications:appType:目标类型值,如果返回空,说明索引未生成,需要重新触发索引创建

3. 确认Redis Repository的扫描配置

在Spring Boot主启动类上添加@EnableRedisRepositories,指定Repository所在包路径,确保Repository被正确加载:

@SpringBootApplication
@EnableRedisRepositories(basePackages = "com.yourproject.repository") // 替换为你的Repository包路径
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

4. 检查自定义RedisTemplate的序列化配置

如果自定义了RedisTemplate,需保证序列化方式与spring-data-redis默认逻辑兼容:

  • 默认使用Jackson2JsonRedisSerializer处理实体序列化,若改用其他序列化(如StringRedisSerializer),会导致索引键的格式不匹配,进而查询不到数据。
  • 若必须自定义,需同步配置RedisMappingContext来保证索引生成的正确性。

5. 开启日志调试查询过程

在application.yml中添加日志配置,查看实际执行的Redis命令:

logging:
  level:
    org.springframework.data.redis: DEBUG

启动服务后调用接口,查看日志中的SMEMBERS命令对应的key是否与Redis中实际的索引key一致,以此定位索引键不匹配的问题。

内容的提问来源于stack exchange,提问作者Biljana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:12:59