Play + Anorm + Postgres-将json值加载到case类中 [英] Play + Anorm + Postgres - load json value into a case class

查看:116
本文介绍了Play + Anorm + Postgres-将json值加载到case类中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用anorm来查询元素并将其保存到我的postgres数据库中. 我有一个json列,我想将其作为自己的类阅读.

I am using anorm to query and save elements into my postgres database. I have a json column which I want to read as class of my own.

例如,如果我有以下课程

So for example if I have the following class

case class Table(id: Long, name:String, myJsonColumn:Option[MyClass])
case class MyClass(site: Option[String], user:Option[String])

我正在尝试编写以下更新:

I am trying to write the following update:

DB.withConnection { implicit conn =>
    val updated = SQL(
      """UPDATE employee
        |SET name = {name}, my_json_column = {myClass}
        |WHERE id = {id}
      """.stripMargin)
      .on(
        'name -> name,
        'myClass -> myClass,
        'custom -> id
      ).executeUpdate()
  }
}

我还定义了一个从json到对象的隐式转换器

I also defined a implicit convertor from json to my object

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

我得到的错误是:

type mismatch;
found   : (Symbol, Option[com.MyClass])
required: anorm.NamedParameter
        'myClass -> myClass,
               ^

推荐答案

解决方案只是添加以下内容:

The solution is just to add the following:

implicit val socialDataToStatement = new ToStatement[MyClass] {
  def set(s: PreparedStatement, i: Int, myClass: MyClass): Unit = {
  val jsonObject = new org.postgresql.util.PGobject()
  jsonObject.setType("json")
  jsonObject.setValue(Json.stringify(Json.toJson(myClass)))
  s.setObject(i, jsonObject)
  }
}

和:

implicit object MyClassMetaData extends ParameterMetaData[MyClass] {
   val sqlType = "OTHER"
   val jdbcType = Types.OTHER
}

这篇关于Play + Anorm + Postgres-将json值加载到case类中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆