【问题标题】:Anorm parsing JSON from PostgreSQL jsonb columnAnorm 从 PostgreSQL jsonb 列解析 JSON
【发布时间】:2023-03-13 19:06:01
【问题描述】:

我正在运行 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 我会收到 TypeDoesNotMatch 错误。

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具有空值。

【问题讨论】:

  • 可以为空的列需要使用.?进行映射,查看文档
  • 是的,只是在这里写这段代码时出错,这不是我的实际代码。
  • 如果使用.get[T].?,则不会引发UnexpectedNullable

标签: postgresql scala anorm


【解决方案1】:

目前我发现的唯一解决方法是将 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.*)
}

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 2021-10-19
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多