【问题标题】:spring data couchbase N1ql Query parameterspring data coouchbase N1ql 查询参数
【发布时间】:2017-10-22 16:32:08
【问题描述】:

我正在使用 Spring-data-Couchbase 2.1.5。我想在下面给出的文档上运行以下 N1QL 查询。谁能建议怎么做??

1) N1QL 查询

SELECT pkgPrcStsCd, count(*) AS count
FROM `default`
WHERE ANY sort IN busOp SATISFIES sort.opPlnDt = now_str('1111-11-11') END
GROUP BY (pkgPrcStsCd)

2) Couchbase 中的文档为

{
  "docType": "busOpPrcShu",
  "docId": "busOpPrcShu-US-NJTIN-PKG-1Z2FW2350209207151-171901",
  "docVer": 1,
  "className": "com.operations.package",
  "shuTckNr": "32547354dhfgds",
  "ogzCountryCode": "US",
  "ogzNumber": "12345",
  "pkgXcpRsnCd": "78",
  "pkgPrcStsCd": "01",
  "prcStsUdtTs": "2017-05-19 15:50:30",
  "evtMosRenSleIr": "true",
  "evtTypCd": "02",
  "evtCgyCd": "01",
  "evtTypUdtTs": "2017-05-19T11:45:30Z",
  "eqpNr": "04856374",
  "busOp": [
    {
      "docId": "gkfhgjh",
      "opPlnDt": "2017-05-22",
      "wrkCpt": [
        {
          "docId": "fhkdshfsj"
        }
      ]
    }
  ]
}

【问题讨论】:

    标签: spring-data-couchbase


    【解决方案1】:

    该查询似乎不能映射到实体类型,所以这超出了 Spring Data 的范围。 Spring Data Couchbase 通常会在查询实体时应用额外的步骤,例如通过_class 属性选择具体类或解码文档的元数据以获取键...

    但是 CouchbaseTemplate 有一个 findByN1qlFragment 方法,它不会尝试这些额外的步骤,而只是使用 Jackson 来解组您提供的类型。因此,您可以拥有一个包含 2 个字段的简单类(一个用于 pkgPrcStsCd,一个用于 count)并使用该方法。

    查询必须使用 Couchbase SDK 手动构建,可以是纯 String 或使用 Select DSL。

    【讨论】:

    • 谢谢西蒙...我能够使用 findByN1qlFragment 获得结果。但我面临的问题是参数化的 where 子句......你能帮我解决以下查询吗
    • String ramainingPackageByExceptionQuery = "SELECT shuTckNr AS trackingNumber FROM "+""+bucketName+" "+ "busOp 中的任何排序满足 sort.opPlnDt = now_str('1111-11-11') END AND evtTypCd = $1";
    • JsonArray placeholderValue = JsonArray.from(eventTypeCode); ParameterizedN1qlQuery parameterizedN1qlQuery = N1qlQuery.parameterized(ramainingPackageByExceptionQuery, placeholderValue); List remainingPackagesByExceptionDatas = couchbaseTemplate.findByN1QLProjection(parameterizedN1qlQuery,RemainingPackagesByExceptionData.class);
    • 我面临的问题是 log.info("placeholderValue==========="+placeholderValue);正在打印 "\"03\"" 。理想情况下应该是“03”
    • 如果您只需要一个普通数字,为什么还要使用JsonArray?只需摆脱 JsonArray 包装?
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多