【发布时间】:2021-08-03 07:03:25
【问题描述】:
尝试将命名查询与 Spring Data Elasticsearch 一起使用时,我遇到了以下异常。
ClassCastException: org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl cannot be cast to org.springframework.data.elasticsearch.core.SearchPage
我要查询的是:
public interface PlayerRepository extends ElasticsearchRepository<PlayerEntity, String> {
@Query("{\"bool\":{\"must\":[{\"terms\":{\"playerNumber.keyword\": ?0}}]}}")
SearchPage<PlayerEntity> fetchPlayers(JSONArray playerNumbers, Pageable pageable);
}
如果我不使用 @Query 注释,而是让 Spring 从方法名称派生查询,如下所示:
SearchPage<PlayerEntity> findPlayerEntityByPlayerNumberIn(List<String> playerNumbers, Pageable pageable);
它按预期工作。但是,PlayerNumber 字段是一个@MultiField,它支持Text 和Keyword 的字段类型,如下所示:
@Document(indexName = "#{@playersIndexName}")
public class PlayerEntity {
@MultiField(
mainField = @Field(type = Text, name = "playerNumber"),
otherFields = {@InnerField(suffix = "keyword", type = Keyword)})
private String playerNumber;
...
}
我需要在这里使用关键字映射而不是文本映射。据我所知,Spring Data Elasticsearch 无法从 InnerField 上的方法名称派生查询,这就是我采用命名查询方法的原因。但似乎使用声明的查询方法,详细的here,只支持详细的返回类型的子集here
此外,我还需要使用 SearchPage 返回类型,因为那里有我需要做出决定的元数据。
所以我想有几个问题:
- 是否可以在派生查询方法中使用
InnerFields?即类似SearchPage<PlayerEntity> findPlayerEntityByPlayerNumber_KeywordIn(List<String> playerNumbers, Pageable pageable); - 命名查询是否可以返回
SearchPage?我认为这可能通过自定义存储库实现来实现,但如果我可以让上述任何一种方法发挥作用,那将是理想的。
感谢您的帮助!!
spring-data-elasticsearch 版本:4.0.3.RELEASE
spring-boot-starter-parent 版本:2.3.3.RELEASE
elasticsearch 版本:7.11.1
【问题讨论】:
标签: java spring spring-boot elasticsearch spring-data-elasticsearch