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

Spring Data Elasticsearch版本升级后@Query转义字符异常问题

异常原因

升级到Spring Data Elasticsearch 4.x(对应Spring Boot 2.2.14)后,框架对@Query注解中参数的JSON解析逻辑变得更严格。旧版本中,手动拼接的带转义引号的字符串能被框架兼容处理,但新版本会将参数中的转义反斜杠(\)直接保留到最终生成的JSON查询语句中,导致JSON格式非法——比如你传入的querylink包含转义后的引号\",最终生成的JSON里会出现多余的转义符,触发JSON解析器报错。

解决方案1:改用原生查询构建器(推荐)

放弃手动拼接JSON字符串,使用Spring Data Elasticsearch提供的NativeSearchQueryBuilder构建查询,彻底规避转义问题:

Service层代码修改

// 直接传入原始link数组,无需手动拼接字符串
NativeSearchQuery query = new NativeSearchQueryBuilder()
    .withFilter(QueryBuilders.termsQuery("linkname", link))
    .withPageable(PageRequest.of(page-1, pageSize))
    .build();

Page<Testtables> res = elasticsearchRepo.search(query);

Repository层修改

无需自定义getMethod,直接继承ElasticsearchRepository即可使用自带的search方法:

public interface ElasticsearchRepo extends ElasticsearchRepository<Testtables, String> {
}

解决方案2:修复@Query的参数传递方式

如果坚持使用@Query,不要手动拼接JSON数组,直接传入字符串列表,让框架自动处理JSON序列化:

Repository层修改

@Query("{\"bool\":{\"filter\":[{\"terms\":{\"linkname\":?0}}]}}")
Page<Testtables> getMethod(List<String> linkList, Pageable pageable);

Service层代码修改

直接传入原始的link列表,无需任何字符串拼接操作:

res = elasticsearchRepo.getMethod(link, PageRequest.of(page-1, pageSize));

旧版本兼容说明

Spring Data Elasticsearch 3.x(对应旧版Spring Boot)对@Query参数的处理较为宽松,会自动处理参数中的转义字符,允许手动拼接的JSON字符串直接嵌入查询。但新版本为适配Elasticsearch 7.x的规范,严格遵循JSON格式要求,不再支持这种不规范的参数传递方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:51:20