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

Spring Boot升级后ApkHistoryRepository的search方法未定义问题

问题修正方案

问题原因

Spring Data Elasticsearch 4.x(对应Spring Boot 2.6.x版本)对ElasticsearchRepository的API做了调整:移除了直接接收BoolQueryBuilder作为参数的search方法,要求使用NativeSearchQuery(实现了Query接口)来封装查询条件。

修正步骤

  1. 导入NativeSearchQuery相关类
  2. 将原有的BoolQueryBuilder包装到NativeSearchQuery实例中
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:31:04