在Anorm中将Postgres PGObject转换为JsValue

时间:2017-11-07 00:10:13

标签: postgresql scala jdbc anorm

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

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

此查询的返回对象是PGObject类型,它是JDBC在未识别数据库传递的对象类型时使用的默认对象。

我想像这样检索这个值:

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

1 个答案:

答案 0 :(得分:0)

您有两种选择。

选项一:只需将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]用作有效的转换类型。