簡體   English   中英

Anorm從PostgreSQL jsonb列解析JSON

[英]Anorm parsing JSON from PostgreSQL jsonb column

我正在運行play 2.3並且無法更新...而我正在嘗試解析jsonb列時出現錯誤消息play - Cannot invoke the action, eventually got an error: java.lang.RuntimeException: UnexpectedNullableFound(ColumnName(.sports,Some(sports)))

我的代碼是:

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”(...),因為我已經使用JSON_AGG(... )填充了來自另一個表中的數據的此列,因此它是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命令的結果之間的唯一區別(在getMember()和getMemberWithSport()中)是,對於第一個查詢,我在體育運動中一無所獲。第二個查詢(在工作中的那個)將返回填充有空值的JSON 。

我目前發現的唯一解決方法是將COALESCE添加到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.*)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM