2013-10-25 66 views
6

如何將帶有Anorm的PostgreSQL 9.3數據庫中的JsObject轉換爲json數據類型字段而不必將其轉換爲字符串?使用Anorm在PostgreSQL json字段中插入Json對象

給定的PostgreSQL 9.3表,例如:

create table profiles 
(
    id serial primary key, 
    profile json null 
); 

隨着播放2.2,這個測試成功:

package helpers 

import anorm._ 
import org.specs2.mutable._ 
import org.specs2.runner._ 
import org.junit.runner._ 
import play.api.db.DB 
import play.api.libs.json._ 
import play.api.test._ 

@RunWith(classOf[JUnitRunner]) 
class AnormTest extends Specification { 
    "AnormTest" should { 
    "insert a JSON object" in new WithApplication { 
     val profile = Json.obj("language" -> "en") 
     val sql = SQL("insert into profiles (profile) values (CAST({profile} AS json))") 
     .on("profile" -> profile.toString) 
     DB.withConnection { implicit c => sql.execute() } 
    } 
    } 
} 

但隨着這些線路變化:

 val sql = SQL("insert into profiles (profile) values ({profile})") 
     .on("profile" -> profile) 

它產生這種錯誤:

org.postgresql.util.PSQLException: 
Can't infer the SQL type to use for an instance of play.api.libs.json.JsObject. 
Use setObject() with an explicit Types value to specify the type to use. 

由於與ANORM我們通常通過適當的數據類型而不是文本(例如,一個UUID對象uuid數據類型的列),這不是最佳的具有與JsObject轉換爲字符串,並將它轉換回json數據類型在SQL語句中。

有關此問題及其解決方法的示例,請參閱Using PostgreSQL's native JSON support in Play Framework 2.1-RC1

如何避免使用Anorm以直接將JsObject作爲json數據類型?

回答

8

對於播放2.4及以上使用anorm.Object(值:org.postgresql.util.PGobject)類,而不是直接值:

val pgObject = new org.postgresql.util.PGobject(); 
pgObject.setType("json"); 
pgObject.setValue(profile); 
val sql = SQL("insert into profiles (profile) values ({profile})") 
    .on("profile" -> anorm.Object(pgObject))