这是我使用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)
}
答案 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]
用作有效的转换类型。