Spring Data Couchbase N1ql Параметр запроса

Я использую 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"
        }
      ]
    }
  ]
}

person dhiraj singh    schedule 22.05.2017    source источник


Ответы (1)


Этот запрос не выглядит так, как будто он может сопоставляться с типом сущности, поэтому это выходит за рамки Spring Data. Spring Data Couchbase обычно применяет дополнительные шаги при запросе сущностей, например, выбирает конкретный класс с помощью атрибута _class или декодирует метаданные документа для ключа...

Однако у CouchbaseTemplate есть метод findByN1qlFragment, который не пытается выполнить эти дополнительные шаги, а просто использует Джексона для демаршаллинга к типу, который вы предоставили. Таким образом, у вас может быть простой класс с двумя полями (одно для pkgPrcStsCd, одно для count) и использовать этот метод.

Запрос должен быть создан вручную с использованием Couchbase SDK, либо как обычный String, либо с использованием Select DSL.

person Simon Baslé    schedule 23.05.2017
comment
Спасибо, Саймон... я смог получить результат, используя findByN1qlFragment. Но проблема, с которой я столкнулся, заключается в параметризованном предложении where... Можете ли вы помочь мне с запросом ниже? - person dhiraj singh; 24.05.2017
comment
Строка ramainingPackageByExceptionQuery = ВЫБРАТЬ shuTckNr AS trackingNumber FROM +"+bucketName+" + WHERE ЛЮБАЯ сортировка В busOp СООТВЕТСТВУЕТ sort.opPlnDt = now_str('1111-11-11') END AND evtTypCd = $1; - person dhiraj singh; 24.05.2017
comment
JsonArray placeholderValue = JsonArray.from(eventTypeCode); ParameterizedN1qlQuery параметризованныйN1qlQuery = N1qlQuery.parameterized(ramainingPackageByExceptionQuery, placeholderValue); List‹RemainingPackagesByExceptionData› оставшиесяPackagesByExceptionDatas = CouchbaseTemplate.findByN1QLProjection(parameterizedN1qlQuery,RemainingPackagesByExceptionData.class); - person dhiraj singh; 24.05.2017
comment
Проблема, с которой я столкнулся, это log.info(placeholderValue===========+placeholderValue); печатает \03\ . В идеале должно быть 03 - person dhiraj singh; 24.05.2017
comment
зачем использовать JsonArray, если все, что вам нужно, это простое число? просто избавься от упаковки JsonArray ???? - person Simon Baslé; 24.05.2017
comment
Могу ли я передать строку, не оборачивая ее в JsonArray или Json Object? Я не могу видеть ничего подобного - person dhiraj singh; 24.05.2017
comment
параметризованныйN1qlQuery = N1qlQuery.параметризованный (ramainingPackageByExceptionQuery, 03); - person dhiraj singh; 24.05.2017
comment
ах, плохо, вам действительно нужен JsonArray с позиционным параметром... тот факт, что ваш журнал показывает квадратные скобки, просто потому, что вы печатаете массив значений позиционных параметров запроса, а не первое значение массива... - person Simon Baslé; 24.05.2017
comment
Спасибо за ответ, Саймонс... проблема в \03\ . вы можете видеть, что есть \ . это связано с JsonArray placeholderValue = JsonArray.from(eventTypeCode); где eventTypeCode — строковый параметр. Но когда я делаю - person dhiraj singh; 24.05.2017
comment
JsonArray placeholderValue = JsonArray.from(03); здесь такое же значение жестко закодировано, тогда все работает нормально. - person dhiraj singh; 24.05.2017
comment
что, если вы зарегистрируете переменную eventTypeCode напрямую? не мог ли он уже быть преобразован в JSON или как-то иначе изменен по сравнению с тем, что вы ожидали? - person Simon Baslé; 25.05.2017