Scala Slick:带有可为空列的 groupBy
Scala Slick: groupBy with nullable column
我正在尝试使用 Scala 2.11 + Slick 3.1.0 + Evolutions + H2 数据库从可为空的列中获取所有结果。在对 NOT NULL 列执行 groupBy 操作时,一切都按预期进行。但是,如果该列可以为空,当我们 运行 this:
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>
我已经搜索并尝试添加一个额外的案例来试图覆盖空值或 null 值,但它没有用,或者我的案例可能不正确。
提前致谢。
因此,如果您有一个可为空的列,Slick 应该根据您的查询 return 一个 Option[T]
,但根据我的阅读,分组依据在很多情况下都是错误的,所以我假设它应该 return 选项可能是错误的。
文档中的更多信息可能会对您有所帮助。
http://slick.lightbend.com/doc/3.1.0/sql-to-slick.html#id19
但也感觉您可能 运行 进入不受支持的内容,如下所示:
https://github.com/slick/slick/issues/1285
列的定义应该可以为空,即:def tenant = column[Option[String]]def tenant = column[Option[String]]
.
确实,在执行 metrics.groupBy(_.tenant).map { case (tenant, group) => tenant }
时,结果 Seq
可能包含空值,这会导致您提到的 NPE。
我正在尝试使用 Scala 2.11 + Slick 3.1.0 + Evolutions + H2 数据库从可为空的列中获取所有结果。在对 NOT NULL 列执行 groupBy 操作时,一切都按预期进行。但是,如果该列可以为空,当我们 运行 this:
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>
我已经搜索并尝试添加一个额外的案例来试图覆盖空值或 null 值,但它没有用,或者我的案例可能不正确。
提前致谢。
因此,如果您有一个可为空的列,Slick 应该根据您的查询 return 一个 Option[T]
,但根据我的阅读,分组依据在很多情况下都是错误的,所以我假设它应该 return 选项可能是错误的。
文档中的更多信息可能会对您有所帮助。 http://slick.lightbend.com/doc/3.1.0/sql-to-slick.html#id19
但也感觉您可能 运行 进入不受支持的内容,如下所示: https://github.com/slick/slick/issues/1285
列的定义应该可以为空,即:def tenant = column[Option[String]]def tenant = column[Option[String]]
.
确实,在执行 metrics.groupBy(_.tenant).map { case (tenant, group) => tenant }
时,结果 Seq
可能包含空值,这会导致您提到的 NPE。