2017-03-29 33 views
0

我正在玩2.3,没有办法更新解析JSON ... 得到控制而我试图解析jsonb专栏中,我得到的错误play - Cannot invoke the action, eventually got an error: java.lang.RuntimeException: UnexpectedNullableFound(ColumnName(.sports,Some(sports))) ANORM和PostgreSQL jsonb列

我的代码是:

case class Sport(
    id: UUID, 
    name: Option[String] 
) 

implicit val SportWrites: Writes[Sport] = Json.writes[Sport] 
implicit val SportReads: Reads[Sport] = (
    (JsPath \ "f1").read[UUID] and 
    (JsPath \ "f2").readNullable[String] 
) 

case class Member(
    id:UUID, 
    name:String, 
    sports: List[Sport] 
) 

def memberParser: RowParser[Member] = { 
    get[UUID]("member_id") ~ 
    get[String]("name") ~ 
    get[JsValue]("sports") map { 
     case(id ~ name ~ sports) => Member(
      id, name 
      sports.validate[List[Sport]].getOrElse(List()) 
     ) 
    } 
} 


def getMember():List[Member] = DB.WithConnection{ implicit c => 
    SQL("SELECT m.id, m.name, m.sports::json from member m ").as(memberParser.*) 
} 

|运动|是一个jsonb postgresql列,如果我不把这个列作为::json我得到一个TypeDoesNotMatc h错误。

Json字段被命名为“f1”,“f2”,“f3”(...),因为我用另一个表中的数据填充了此列,因此它是postgresql的命名。

也此功能工作:

def getMemberWithSports():List[Member] = DB.withConnection{ implicit c => 
    SQL(""" 
     SELECT m.member_id, m.name, 
     json_agg(row_to_json(row(s.sport_id, s.name))) as sports 
     FROM rank_member m 
     LEFT JOIN member_sport ms ON m.member_id = ms.member_id 
     LEFT JOIN sport s ON ms.sport_id = s.sport_id 
     GROUP BY m.member_id, m.fullname 
    """).as(memberParser.*) 
} 

这两个SQL COMMANDE的结果之间的唯一差别(在getMember()& getMemberWithSport())是与第一个查询我在体育得到什么都不会第二个查询(工作中的那个查询)返回填充了空值的JSON。

+0

列被可空需要被mappedusing'',看看文档 – cchantep

+0

是的,只是写这段代码的错误,这不是我的实际代码。 – Nils

+0

如果使用'.get [T]。?',则不会引发'UnexpectedNullable'。 – cchantep

回答

-1

唯一的解决方法我找到的那一刻是通过添加聚结以SQL查询如下:?

def getMember():List[Member] = DB.WithConnection{ implicit c => 
    SQL("SELECT m.id, m.name, COALESCE(m.sports::json, '[]') as sports from member m ").as(memberParser.*) 
}