Anorm从PostgreSQL jsonb列解析JSON

Anorm从PostgreSQL jsonb列解析JSON,postgresql,scala,anorm,Postgresql,Scala,Anorm,我正在运行play 2.3,无法更新。。。 当我试图解析jsonb列时,我得到一个错误play-无法调用该操作,最终得到一个错误:java.lang.RuntimeException:UnexpectedNullableFound(ColumnName(.sports,Some(sports))) 我的代码是: case class Sport( id: UUID, name: Option[String] ) implicit val SportWrites: Writes

我正在运行play 2.3,无法更新。。。 当我试图解析jsonb列时,我得到一个错误
play-无法调用该操作,最终得到一个错误: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.*)
}
|Sports |是一个jsonb postgresql列,如果我不将此列转换为
::json
我会得到一个
TypeDoesNotMatc
h错误

Json字段被命名为“f1”、“f2”、“f3”(…),因为我用另一个表中的数据填充了该列,其中包含
Json\u 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()中)的结果之间的唯一区别是,第一个查询在sport中什么也得不到,第二个查询(在游戏中工作的查询)返回用空值填充的JSON。

目前我找到的唯一解决方法是在SQL查询中添加COALESCE,如下所示:

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.*)
}

可为空的列需要使用
映射,请查看文档是的,只是在此处写入这段代码时出错,这不是我的实际代码。如果使用
.get[T]。
,则不会引发
意外为空的