【问题标题】:Couchbase parameterized query with numeric values带有数值的 Couchbase 参数化查询
【发布时间】:2020-05-23 12:02:28
【问题描述】:

我正在尝试将数值添加到参数化的AnalyticsQuery,但在查询运行时不断出现错误。创建查询的 java 如下所示:

  private ParameterizedAnalyticsQuery aggregateQuery(String userId, Long from, Long to) {
    return AnalyticsQuery.parameterized(
        "select d.field1,"
            + " d.field2"
            + " from data d"
            + " where d.userId = $userId"
            + " and d.timestamp between $from and $to",
        JsonObject.create()
            .put("userId", userId)
            .put("from", from)
            .put("to", to)
    );
  }

运行查询时返回以下错误:

<< Encountered \"from\" at column 213. ","code":24000}]

如果我将查询更改为以下内容,则它可以工作并返回行:

    return AnalyticsQuery.parameterized(
        "select d.field1,"
            + " d.field2"
            + " from data d"
            + " where d.userId = $userId"
            + " and d.timestamp between " + from
            + " and " + to,
        JsonObject.create()
            .put("userId", userId)
    );

为什么参数不是Strings时会出现问题?有没有办法使用带有数值的参数化查询?

【问题讨论】:

  • 我也刚刚在 .NET 中尝试过。我的猜测是 between/and 要么无法参数化(还),要么存在错误。
  • 我自己试试,我会尽快回复你的

标签: java couchbase couchbase-java-api


【解决方案1】:

FROM 和 TO 是 N1QL for Analytics 中的保留关键字,因此在用作参数名称时必须放在反引号中:

... and d.timestamp between $`from` and $`to`

有关所有保留关键字的列表,请参阅: https://docs.couchbase.com/server/current/analytics/appendix_1_keywords.html

【讨论】:

  • 我注意到的另一件事(无论如何在 .NET 中)是我必须使用“$from”的命名参数,而不仅仅是“from”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多