Spring Boot升级后ApkHistoryRepository的search方法未定义问题
问题修正方案
问题原因
Spring Data Elasticsearch 4.x(对应Spring Boot 2.6.x版本)对ElasticsearchRepository的API做了调整:移除了直接接收BoolQueryBuilder作为参数的search方法,要求使用NativeSearchQuery(实现了Query接口)来封装查询条件。
修正步骤
- 导入
NativeSearchQuery相关类 - 将原有的
BoolQueryBuilder包装到NativeSearchQuery实例中 - 调用
search方法时传入包装后的查询对象,按需转换返回结果为实体集合
修正后的代码
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import java.util.stream.Collectors; public Iterable<ApkHistory> findInstallHistoryByApkId(int intervalle, Long apkId) { LocalDate today = LocalDate.now(); LocalDate beginningDate = today.minusDays(intervalle); BoolQueryBuilder query = QueryBuilders.boolQuery(); query.must(QueryBuilders.rangeQuery(dateName) .gte(beginningDate) .lte(today)); query.must(QueryBuilders.matchQuery(apkIdName, apkId)); query.must(QueryBuilders.matchQuery(event, Event.INSTALL)); // 用NativeSearchQueryBuilder构建查询对象 NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(query) .build(); // 执行查询并转换为实体集合 return apkHistoryRepo.search(searchQuery) .stream() .map(SearchHit::getContent) .collect(Collectors.toList()); }
补充说明
- 若需要获取ES查询的元数据(如得分、高亮信息等),可以直接返回
SearchHits<ApkHistory>类型,无需转换为实体集合 - 保持
ElasticsearchRepository继承关系的前提下,上述方式是最贴合原有代码逻辑的修正方案
内容的提问来源于stack exchange,提问作者Teddy Kossoko
相关产品推荐
相关产品推荐

