Spring Data Elasticsearch @Query结合投影获取指定字段问题
解决仅返回指定字段的方案
针对你的需求,以下两种方案均无需编程式查询,仅通过@Query注解结合对应配置即可实现:
1. 在@Query中直接指定返回字段
你提到_source过时,但在Spring Data Elasticsearch的@Query场景下,依然可以通过在查询JSON根节点添加_source参数指定要返回的字段,语法如下:
interface BookRepository extends ElasticsearchRepository<Book, String> { @Query(""" { "_source": ["author"], "bool":{ "must":[ { "term":{ "name": "#{#name}" } } ] } } """) Page<Book> findByName(String name, Pageable pageable); }
执行后返回的Book实体仅会填充author字段,其余字段为null。
2. 正确使用基于接口的投影
你之前尝试投影无效果,大概率是用法有误,正确步骤如下:
步骤1:定义投影接口
创建仅包含目标字段getter方法的接口:
interface AuthorProjection { String getAuthor(); }
步骤2:修改Repository方法返回类型
将Repository方法的返回值改为Page<AuthorProjection>,保留原@Query注解即可:
interface BookRepository extends ElasticsearchRepository<Book, String> { @Query(""" { "bool":{ "must":[ { "term":{ "name": "#{#name}" } } ] } } """) Page<AuthorProjection> findByName(String name, Pageable pageable); }
Spring Data Elasticsearch会自动将查询结果映射到投影接口实例中,仅返回author字段的值。
补充说明
@SourceFilter注解仅适配ElasticsearchOperations的编程式查询,在Repository的@Query场景下确实不生效,无需尝试。- 若使用Elasticsearch 7.x+版本,
_source仍是有效的查询参数,并未完全废弃,只是存在更灵活的替代方案,但在Spring Data Elasticsearch的@Query中可正常使用。
内容的提问来源于stack exchange,提问作者Martijn Jan Jaap de Bruin
相关产品推荐
相关产品推荐

