2015-01-21 90 views
3

PostgreSQL表my_tabledata列的格式为jsonb。我想插入一个Scala JsObject(或JsValue),但不知道该怎么做!通过Scala Anorm将数据插入到PostgreSQL jsonb列表(在Play Framework中)

下面的代码无法编译,因为on函数需要json是一个String

def add(json: JsObject): Option[Long] = { 
    DB.withConnection { 
     implicit c => 

     val query = """ 
      insert into my_table(data) 
     values({data});""" 

     SQL(query).on(
      "data" -> json 
     ).executeInsert() 
    } 
    } 

什么解决的办法?

+0

可能重复(http://stackoverflow.com/questions/27573778/postgresql-jsonb-and -jdbc) – cchantep 2015-01-21 08:52:09

+0

可以插入特定参数转换以准备部分SQL语句并传递JSON值。 – cchantep 2015-01-21 08:55:42

+0

@applicius它不是[PostgreSQL jsonb,'?'的重复和JDBC](http://stackoverflow.com/questions/27573778/postgresql-jsonb-and-jdbc)。我的问题是关于'insert'语句。 – Blackbird 2015-01-21 12:53:22

回答

2

使用:: jsonb标记在值的末尾。例如。

//my scala variables 

val jsonDescription: String = "{\"name\":\"ksulr\"}" 
val age = 15 

//my insert statement 
val sql = "INSERT into person(json_description,age) VALUES(?::jsonb,?)" 

//prepared statement 
val statement = conn.prepareStatement(sql) 

//insert values into the sql statement 
statement.setString(1,jsonDescription) 
statement.setInt(2,age) 

statement.executeUpdate() 

这将起作用。它为我工作。这就是我如何插入jsonb类型的postgres db列。

+1

感谢您的回答!它可能有效,但它不使用Anorm。 – Blackbird 2015-05-21 22:14:36

0

您可以使用ToStatement转换器对象:?PostgreSQL的jsonb,\'\'和JDBC]

def add(json: JsObject): Option[Long] = { 
    DB.withConnection { implicit c =>  
     val query = """insert into my_table(data) values(${data});""" 
     SQL(query).executeInsert() 
    } 
} 

implicit object jsObjectStatement extends ToStatement[JsObject] { 
    override def set(s: PreparedStatement, index: Int, v: JsObject): Unit = { 
     val jsonObject = new PGobject() 
     jsonObject.setType("json") 
     jsonObject.setValue(Json.stringify(v)) 
     s.setObject(index, jsonObject) 
    } 
    } 
相关问题