即使解析器被标记为可选,Play Scala Anorm解析器也会抛出UnexpectedNullableFound

Teo*_*zon 6 sql scala playframework anorm

该表定义如下:

CREATE TABLE Session (
    id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    something varchar(32),
    PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像这样:

SQL("SELECT something FROM Session WHERE id={id}").on("id" -> id).as(str("something") ?)
Run Code Online (Sandbox Code Playgroud)

虽然这Option[String]在编译时提供了正确的type(),但它会RuntimeException(UnexpectedNullableFound(SESSION.SOMETHING))在运行时产生.

为了记录,我正在使用Play 1.2.4,Play Scala 0.9.1和捆绑的H2数据库.

tha*_*ing 9

问题是,str("something") ?意味着从不可为空的列"某事"获取,但我不确定是否会有一行.我想你想要的是:

SQL("SELECT something FROM Session WHERE id={id}").on("id" -> id).as(get[Option[String]]("something") ?).getOrElse(None)
Run Code Online (Sandbox Code Playgroud)

SQL语句给我们一个Option[Option[String]],因为我们不确定该行是否存在,如果该行存在,我们不确定该列是否为null.这就是为什么我们需要做一个getOrElse来把它简化为一个Option[String]