【问题标题】:Slick: Read nullable values as option when left joinSlick:左连接时读取可空值作为选项
【发布时间】:2014-07-03 03:43:05
【问题描述】:

使用 Slick 加入时的问题:我有 2 个表 User 和 UserInfo,我想离开它们以获取用户信息。我试过这个:

val q = for{
  (user,info) <- User leftJoin UserInfo on (_.id === _.userid)
} yield(user, info)

但是 UserInfo 表有一些可以为空的字段,所以当我尝试执行查询时:

q.map(user_info => (user_info._1,user_info._2)).list

它会出错,因为 user_info._2 有一些空值。我知道在 UserInfo 中产生每个字段并为可空字段添加 getOrElse(None) 的解决方案。但是,UserInfo 有很多字段,所以我不想使用它。

谁能帮帮我?

【问题讨论】:

  • 如果可空字段在架构中被定义为Options,那么它们将被返回,我怀疑你的问题出在其他地方,例如你到底得到了什么样的异常?您的架构是如何定义的?
  • x.getOrElse(None) 应该和x 完全一样吧?这怎么能解决你的问题?

标签: sql scala nullable slick-2.0


【解决方案1】:

你可以做的是,定义一个进行转换的函数,然后在你的地图中使用它:

def nullToOption[A](input: A): Option[A] = input match {
  case null => None
  case x    => Some(x)
}

然后您只需在地图中使用它。

我用一个简单的列表做了一个简单的例子:

val lst = List("Hello", null, "hi", null)

val newlst = map lst nullToOption

newList 现在如下:List(Some("Hello"), None, Some("hi"), None)

当然你可以修改 nullToOption 来满足你的需要;这是一个采用元组的版本:

def nullToOption[A, B](input: (A,B)): (Option[A], Option[B]) = input match {
  case (x, y)       => (Some(x), Some(y))
  case (x, null)    => (Some(x), None)
  case (null, y)    => (None, Some(y))
  case (null, null) => (None, None)
}

【讨论】:

  • 您的非元组参数的nullToOption 已作为Option.apply (Option(...)) 存在于标准库中。
  • 我不知道,我只是把这个写在我的头上
猜你喜欢
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多