【问题标题】: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] 作为有效的转换类型。