Spring Data Elasticsearch自定义@Query,参数超过10个
Posted
技术标签:
【中文标题】Spring Data Elasticsearch自定义@Query,参数超过10个【英文标题】:Spring Data Elasticsearch custom @Query with more than 10 parameters 【发布时间】:2019-04-01 20:03:38 【问题描述】:我正在使用 spring-boot-starter-data-elasticsearch 2.1.0.RC1。
我有一个自定义查询(通过 @Query 注释),我想在其中传递 11 个参数。查询如下所示:
"bool" :
"must" : [
"range" :
"attribute0" : "gte" : ?0, "lte" : ?1
,
"range" :
"attribute1" : "gte" : ?2, "lte" : ?3
,
"term": "attribute2": "?4"
,
"term": "attribute3": "?5"
,
"term": "attribute4": "?6"
,
"term": "attribute5": "?7"
,
"term": "attribute6": "?8"
,
"term": "attribute7": "?9"
,
"term": "attribute8": "?10"
]
在我的存储库中,它看起来像这样:
@Query("\"bool\":\"must\":[\"range\":\"attribute0\":\"gte\":?0,\"lte\":?1,\"range\":\"attribute1\":\"gte\":?2,\"lte\":?3,\"term\":\"attribute2\":\"?4\",\"term\":\"attribute3\":\"?5\",\"term\":\"attribute4\":\"?6\",\"term\":\"attribute5\":\"?7\",\"term\":\"attribute6\":\"?8\",\"term\":\"attribute7\":\"?9\",\"term\":\"attribute8\":\"?10\"]")
Page<Entity> findAllByAttributes(
Integer param0, Integer param1,
Integer param2, Integer param3,
String param4, String param5,
String param6, String param7,
String param8, String param9,
String param10, Pageable pageable);
问题是,我不能使用超过 10 个参数(个位索引 ?0 到 ?9)。 占位符 ?10 被解析为附加零的占位符 1。
我在 Spring Data Elasticsearch 参考文档中找不到任何关于参数数量限制的内容。
如何将超过 10 个参数传递到 @Query?
【问题讨论】:
嗯很奇怪,因为用于计算参数的模式是"\?(\d+)"
(可以看到here)
我添加了存储库方法定义。也许它与查询的转义/预处理有关?
【参考方案1】:
Spring Data 是玩数据世界的一个非常大的项目
据我所知,我们可以用另一种方式以不同的方式做同样的事情。
Spring 数据还有一个注释,有助于将方法参数视为查询参数。
注解:@Param
这个注解可以和方法参数本身一起使用。请找到以下格式,它可以帮助扩展方法参数计数以与 spring 数据一起使用。
说明:可以包含N号。带有 @Param
注释的方法参数。请在下面找到有效的表达式来编写注释。
@Param("param0")
现在,当你添加这个带有方法参数的@Param注解时,你必须在@Query
中指定参数,前缀为colon (:)
。在下面的查询中类似于 param0,
@Query(""query": "bool": "must": [ "match": "userId": ":param0" ]")
完整示例:可以看到org_id是查询参数。
@Query(""query": "bool": "must": [ "match": "userId": ":org_Id"]")
List<User> getByOrgId(@Param("org_Id") String orgId)
【讨论】:
【参考方案2】:我也有这个问题。我会提交一个错误。
穷人修复尝试使用像?00、?01、?02这样的编号
在代码中挖掘问题不在于正则表达式,而是看到here的替换命令
result.replace(group, getParameterWithIndex(accessor, index));
这当然会替换所有并认为?1
需要在?1
和?10
中替换
【讨论】:
请在你的 PR 上查看我的 cmets以上是关于Spring Data Elasticsearch自定义@Query,参数超过10个的主要内容,如果未能解决你的问题,请参考以下文章
springboot 集成 spring-data-elasticsearch
Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch