【问题标题】:N1QL query not recognizing parametersN1QL 查询不识别参数
【发布时间】:2017-07-26 18:23:16
【问题描述】:

我正在尝试使用参数化的 N1QL 查询,但它无法识别 json 占位符并抛出不正确的语法异常。

代码:

public static final String LMR_DETAILS 
    = "SELECT * FROM $bucketName WHERE lmr.lmrStatusDescriptionTe ='PENDING'and STR_TO_MILLIS(lmr.recordExpirationTs) BETWEEN STR_TO_MILLIS($startTime) AND STR_TO_MILLIS($endTime)";

String bucketName = bucket.bucketManager().info().name();
                    JsonObject placeHolders = JsonObject.create().put("bucketName", bucketName).put("startTime", reqDates[0]).put("endTime", reqDates[1]);
                    N1qlQuery query = N1qlQuery.parameterized(QueryString.LMR_DETAILS, placeHolders);
                    N1qlQueryResult result = bucket.query(query);

【问题讨论】:

  • FROM 子句后的桶名不能参数化。

标签: n1ql couchbase-java-api


【解决方案1】:

FROM 子句要求作为静态标识符引用桶或子查询后,它不能是参数化变量。将 $bucketName 作为参数化变量移除,并通过动态构造 LMR_DETAILS 替换为实际的存储桶名称。

【讨论】:

  • 谢谢@vsr。但是我必须动态传递存储桶名称,因为我有许多具有不同降压名称的环境。我该怎么做
  • String LMR_DETAILS = "SELECT * FROM " + bucket.bucketManager().info().name() + " WHERE lmr.lmrStatusDescriptionTe ='PENDING' and STR_TO_MILLIS(lmr.recordExpirationTs) BETWEEN STR_TO_MILLIS( $startTime) AND STR_TO_MILLIS($endTime)";
猜你喜欢
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2018-11-19
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多