使用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有很多字段,所以我不想使用它。
任何人都可以帮助我吗?
答案 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)
}