Приведите ответ N1QLQuery в пользовательский объект в Scala - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть простое case class:

case class Account(accountId: Long, login: DateTime)

Теперь я хочу получить документы из корзины Couchbase простым запросом N1QL (он должен вернуть простой список документов JSON, содержащий два поля):

val query = "SELECT u.accountId, u.login FROM `accounts` u WHERE DATE_DIFF_STR(NOW_STR(), u.login, 'day') > 30"
bucket.query(N1qlQuery.simple(query)).map(rows => rows.map(row => row.value().asInstanceOf[Account]).seq)

но я получил сообщение об ошибке в почтальоне:

java.lang.ClassCastException: com.couchbase.client.java.document.json.JsonObject cannot be cast to com.package.account

Мой вопрос - как я могу преобразовывать документы из базы данных в свой пользовательский объект?Я также сначала попытался привести его к RawJSONDocument, но это не помогло.Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 20 февраля 2019

Во-первых, вам может быть интересно узнать, что в настоящее время мы активно работаем над собственным Couchbase Scala SDK, который будет выпущен в этом году, и он будет поддерживать ваш вариант использования для преобразования строк непосредственно в класс case.

Но здесь и сейчас вы не можете напрямую преобразовать JsonObject в класс case.Вам нужно будет использовать toString для извлечения необработанной строки JSON, а затем использовать библиотеку Scala JSON для ее преобразования.У вас есть несколько вариантов здесь:

Джексон

    val json = row.value().toString()
    val mapper = new ObjectMapper()
    mapper.registerModule(DefaultScalaModule)
    val account = mapper.readValue(json, classOf[Account])

uPickle

    val account = upickle.default.read[Account](json)

Jsoniter

    val account = com.github.plokhotnyuk.jsoniter_scala.core.readFromString[Account](json)

Кроме того, есть Цирцея, Json4s, Play Json, Jawn и т. Д.

...