如何在Slick中将scala对象转换为列并在查询中使用对象

时间:2016-01-04 15:28:46

标签: scala slick slick-3.0

我希望将自定义对象用作光滑查询中的值,类似于Scala Enumeration。

sealed trait UserStatus
object UserStatus {
  object Active extends UserStatus
  object Deleted extends UserStatus
}

我为UserStatus定义了MappedColumnType,它运行正常。

implicit val UserStatusColumn = MappedColumnType.base[UserStatus, String](_.toString, _ => UserStatus.Active)

直到我想要'在查询中使用这些对象。

for {
  u <- slickUsers
  if u.status === UserStatus.Active
} yield u

我收到错误

Error:(26, 34) type mismatch;
 found   : models.UserStatus.Active.type
 required: slick.lifted.Rep[?]
      if u.status === UserStatus.Active

当我明确表示它是UserType:

时,它工作正常
for (u <- slickUsers if u.status === UserStatus.Active.asInstanceOf[UserStatus]) yield u

不知怎的,我需要提示Slick,Active.type是UserStatus类型。知道怎么做吗?

2 个答案:

答案 0 :(得分:3)

你需要在这里帮助编译器,类型注释是一种简单的方法:

for {
  u <- slickUsers
  if u.status === (UserStatus.Active : UserStatus)
} yield u

另一个使用的技巧是创建一组&#34;智能构造函数&#34;:

object UserStatus {
  object Active extends UserStatus
  object Deleted extends UserStatus 
  val active: UserStatus = Active
  val deleted: USerStatus = Deleted
}

...允许你写:

 for {
   u <- slickUsers
   if u.status === UserStatus.active
 } yield u

答案 1 :(得分:0)

你可以这样做:

-printf '\n'

您可以在此处找到实时版本:https://github.com/nemoo/play-slick3-example/blob/master/app/models/Task.scala