如何处理Apache Ignite缓存/表列名中的下划线问题
Apache Ignite Spring Data 字段映射与方法名查询问题解决
问题根源
Spring Data的方法名查询机制基于驼峰命名规则解析属性,而你的POJO字段是下划线命名的city_id,Ignite默认直接将Java字段名映射为缓存列名。当你写findByCityId()时,Spring Data会尝试匹配cityId属性,但POJO中不存在该属性,导致查询失效;findByCity_Id()或findByCity__id()的写法也不符合Spring Data解析规则,因此同样无法生效。
解决方案
1. 调整POJO字段名适配驼峰规则
将POJO里的city_id改为驼峰命名的cityId,与方法名解析的属性保持一致:
private String id; private String name; private String cityId; // 驼峰命名适配方法名解析
此时Ignite会自动将cityId映射为缓存中的cityId列,Repository中的findByCityId(String cityId)即可正常执行。
2. 使用@QuerySqlField自定义字段映射(类似Spring Data JPA的@Column)
如果不想修改Java字段名,或缓存表列名固定为city_id,可以通过@QuerySqlField注解显式指定映射关系,让方法名解析匹配到正确的缓存列:
private String id; private String name; @QuerySqlField(name = "city_id") // 明确映射到缓存的city_id列 private String cityId; // Java字段用驼峰,适配方法名解析规则
这种方式既保留了缓存表的下划线列名,又能让Spring Data的方法名查询正常工作。
3. 保留原字段名,使用@Query注解写SQL
这是你已经了解的方案,直接通过SQL语句指定查询条件,不受方法名解析规则限制:
@Repository public interface PersonRepository extends IgniteRepository<Person, String> { @Query("SELECT * FROM Person WHERE city_id = ?") List<Person> findByCityId(String cityId); }
总结
无需仅依赖@Query注解,通过调整POJO字段名适配驼峰规则,或使用@QuerySqlField做自定义字段映射,都能让Spring Data的方法名查询正常生效——其中@QuerySqlField就是Ignite中类似Spring Data JPA@Column的列名自定义映射实现。
内容的提问来源于stack exchange,提问作者Debashis Panda
相关产品推荐
相关产品推荐

