【问题标题】:Converting Postgres PGObject to JsValue in Anorm在 Anorm 中将 Postgres PGObject 转换为 JsValue
【发布时间】:2018-04-19 06:20:10
【问题描述】:

这是我在 Postgres 中使用 Anorm 通过 JDBC 执行的查询:

val sql = s"select row_to_json(t) as result from tablename t;"

此查询返回的对象是 PGObject 类型,这是 JDBC 在无法识别 DB 提供的对象类型时使用的默认对象。

我想像这样检索这个值:

    db.withConnection { implicit conn => 
        SQL(sql).as(get[JsValue]("result").single) 
    } 

【问题讨论】:

标签: postgresql scala jdbc anorm


【解决方案1】:

你有两个选择。

选项一:只需将jsonb 转换为text 类型即可更改交付的类型。

val sql = s"select row_to_json(t)::text as result from tablename;"

选项二

在代码范围内添加隐式转换:

implicit val columnToJsValue:Column[JsValue] =
    anorm.Column.nonNull[JsValue] { (value, meta) =>
    val MetaDataItem(qualified, nullable, clazz)=meta
    value match {
        case json: org.postgresql.util.PGobject=> Right(Json.parse(json.getValue))
        case _ => Left(TypeDoesNotMatch(s"Cannot convert $value: ${value.asInstanceOf[AnyRef].getClass} to Json for column $qualified"))
    }
}

我偷了最后一段代码from here,我不完全确定它是如何工作的。但它完成了它的工作,使您能够使用get[JsValue] 作为有效的转换类型。

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 2021-07-31
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 2014-03-11
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多