【问题标题】:Scala Slick: groupBy with nullable columnScala Slick:groupBy 与可为空的列
【发布时间】:2016-08-24 00:10:40
【问题描述】:

我正在尝试使用 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>

我已经搜索并尝试添加一个额外的案例来尝试覆盖空值或空值,但它不起作用,或者我的案例可能不正确。

提前致谢。

【问题讨论】:

  • 您是否在表格表示中将该列定义为可选?
  • 是的,我已经这样做了。

标签: scala slick


【解决方案1】:

该列的定义应该可以为空,即:def tenant = column[Option[String]]def tenant = column[Option[String]]

确实,在执行metrics.groupBy(_.tenant).map { case (tenant, group) =&gt; tenant } 时,结果Seq 可能包含导致您提到的NPE 的空值。

【讨论】:

  • 这行得通!我想我只需要在映射部分,当然在 SQL 表定义中指定一个字段是否是可选的。谢谢。
【解决方案2】:

因此,如果您有一个可为空的列,则 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

【讨论】:

  • 返回类型是 Option[String]。它已正确添加到我的表定义中。
  • 听起来你遇到的事情可能不是故意的,也许 ping slick gitter 中的人,他们可能会提供更多帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2019-03-03
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多