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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:44:24