如何在Spring Data Elasticsearch中查询含下划线的字段?
解决Spring Data Elasticsearch中下划线字段的查询问题
这个报错我太熟悉了,本质是Spring Data的方法命名解析规则和你实体里的下划线字段不兼容导致的。咱们先理清楚问题出在哪:
你定义的Repository方法findAllByFirst_name,Spring Data会按照它的驼峰命名解析逻辑来拆解方法名——它会把下划线当成属性名的分隔符,误以为你要查询的是first这个属性,而你的实体里根本没有first字段,只有first_name,所以才会抛出No property first found for type User的错误。
下面给你几种可行的解决方案,按需选择:
方案1:使用@Query注解直接指定ES字段
跳过Spring Data的方法名解析,直接用原生的Elasticsearch查询语句来指定下划线字段,这样最直接:
@Repository public interface UserSearchRepository extends ElasticsearchRepository<User,String> { @Query("{\"match\": {\"first_name\": \"?0\"}}") List<User> findAllByFirstName(String firstName); }
这里?0代表方法的第一个参数,这样就能精准匹配ES里的first_name字段了。
方案2:调整实体字段为驼峰,用@Field映射ES下划线字段
把实体里的字段名改成Spring Data更友好的驼峰格式,同时通过@Field注解映射到ES里的下划线字段,这样既符合Spring Data的命名规范,又不改变ES中的存储结构:
@Document(indexName="users",type="records") public class User{ private String id; @Field(name = "first_name") private String firstName; @Field(name = "last_name") private String lastName; }
然后Repository方法就可以写成标准的驼峰命名形式,Spring Data就能正确解析了:
@Repository public interface UserSearchRepository extends ElasticsearchRepository<User,String> { List<User> findAllByFirstName(String firstName); }
方案3:使用自定义查询方法(进阶)
如果不想改实体也不想写@Query,还可以自定义查询逻辑,比如实现UserSearchRepositoryCustom接口,自己编写查询代码,不过这种方式相对繁琐,一般前两种就足够解决问题了。
报错信息回顾:
No property first found for type User
内容的提问来源于stack exchange,提问作者Harshit Bhatt
相关产品推荐
相关产品推荐

