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 Data Elasticsearch

Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch

使用 Spring data mongo 和 Spring data elasticsearch 时如何建模?

Spring Data Elasticsearch

Spring Data ElasticSearch 使用