Spring Data Elasticsearch命名查询类转换异常及InnerField查询问题
问题1解答
Spring Data Elasticsearch 4.0.3.RELEASE 版本完全支持通过下划线分隔的方法名指定MultiField的InnerField查询,你示例的命名写法仅需微调即可正常运行:
- 方法名调整为
SearchPage<PlayerEntity> findPlayerEntityByPlayerNumber_KeywordIn(List<String> playerNumbers, Pageable pageable); - 原理是Spring Data的属性解析规则中,下划线用于明确字段路径层级,会自动映射到
playerNumber.keyword字段执行查询,完全满足你用Keyword类型精确匹配的需求,不需要额外配置。
问题2解答
你遇到的类型转换异常是4.0.3.RELEASE版本的固有特性:该版本中@Query声明式查询默认返回的AggregatedPageImpl未实现SearchPage接口,不需要自定义Repository的解决方案有两种:
- 调整返回类型为
Page<SearchHit<PlayerEntity>>,可以拿到包含相关性得分、字段高亮、原文档在内的所有搜索元数据,分页参数、总条数等分页属性也完整保留 - 若不需要搜索命中的附加元数据,仅需要分页信息,可以将返回类型改为
Page<PlayerEntity>,可直接正常运行,Page接口自带的getTotalElements()、getTotalPages()等方法完全满足常规业务分页决策需求
注意:你的@Query方法第一个参数使用
JSONArray类型存在序列化兼容风险,建议替换为List<String>类型传入参数,避免额外的类型转换异常。
内容的提问来源于stack exchange,提问作者FlatPenguin
相关产品推荐
相关产品推荐

