Spring Data Elasticsearch自定义@Query具有十多个参数

时间:2018-10-28 21:22:46

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

我正在使用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?

2 个答案:

答案 0 :(得分:2)

Spring Data是一个玩弄数据世界的非常大的项目

据我所知,我们可以有另一种方法以不同的方式来做同一件事。

Spring数据还有一个注释,该注释将有助于将方法参数视为查询参数。

  

注释:@Param

此注释可以与method参数本身一起使用。请找到以下格式,该格式可以帮助扩展方法参数计数以用于弹簧数据。

说明:您可以输入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)

答案 1 :(得分:1)

我也有这个问题。我会提交一个错误。

可怜的人尝试使用诸如?00,?01,?02之类的编号

在代码中进行挖掘,问题不在正则表达式中,而在here中看到了替换命令

result.replace(group, getParameterWithIndex(accessor, index));

当然哪个将替换所有内容,并且认为?1?1中都需要替换?10