【问题标题】:Spring Data Elasticsearch custom @Query with more than 10 parametersSpring Data Elasticsearch自定义@Query,参数超过10个
【发布时间】: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
  • 我添加了存储库方法定义。也许它与查询的转义/预处理有关?

标签: spring-boot elasticsearch spring-data spring-data-elasticsearch


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多