我正在尝试使用Scala 2.11 + Slick 3.1.0 + Evolutions + H2数据库从可空列中获取所有结果。在NOT NULL列上执行groupBy操作时,一切都按预期工作。但是,如果列可以为空,那么当我们运行它时:
def listAllTenants(): Future[Seq[String]] = {
dbConfig.db.run(metrics.groupBy(metric => metric.tenant)
.map {
case (tenant, group) => tenant
}.result)
}
其中:
create table `METRIC` (
(...)
`tenant` VARCHAR(255),
);
抛出异常:
[error] c.w.g.c.ErrorHandler - Error while processing request. Exception> slick.SlickException: Read NULL value (null) for ResultSet column <computed>
我已经搜索并尝试添加一个额外的案例试图覆盖空值或空值,但它不起作用,或者我的情况可能不正确。
提前致谢。
答案 0 :(得分:1)
列的定义应该是可空的,即:def tenant = column[Option[String]]def tenant = column[Option[String]]
。
确实,在执行metrics.groupBy(_.tenant).map { case (tenant, group) => tenant }
时,结果Seq
可能包含一个空值,这会导致您提及的NPE。
答案 1 :(得分:0)
因此,如果你有一个可以为空的列,Slick应该根据你的查询返回一个Option[T]
,但是从我读到的内容来看,group by是很多实例的错误,所以我可能错了假设它应该返回选项。
文档中有一些可能对您有帮助的信息。 http://slick.lightbend.com/doc/3.1.0/sql-to-slick.html#id19
但是也感觉你可能遇到像这里不支持的东西: https://github.com/slick/slick/issues/1285