2015-01-21 42 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) 
    } 
    } 
相關問題