Slick 如何将 scala 对象映射到列并在查询中使用对象

nau*_*nau 0 scala slick slick-3.0

我想在光滑的查询中使用我的自定义对象作为值,类似于 Scala Enumeration。

sealed trait UserStatus
object UserStatus {
  object Active extends UserStatus
  object Deleted extends UserStatus
}
Run Code Online (Sandbox Code Playgroud)

我已经为 UserStatus 定义了 MappedColumnType 并且它工作正常。

implicit val UserStatusColumn = MappedColumnType.base[UserStatus, String](_.toString, _ => UserStatus.Active)
Run Code Online (Sandbox Code Playgroud)

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

for {
  u <- slickUsers
  if u.status === UserStatus.Active
} yield u
Run Code Online (Sandbox Code Playgroud)

我得到错误

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

当我明确说它是 UserType 时,它​​工作正常:

for (u <- slickUsers if u.status === UserStatus.Active.asInstanceOf[UserStatus]) yield u
Run Code Online (Sandbox Code Playgroud)

我需要以某种方式提示 Slick Active.type 是 UserStatus 类型。知道怎么做吗?

Ric*_*way 5

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

for {
  u <- slickUsers
  if u.status === (UserStatus.Active : UserStatus)
} yield u
Run Code Online (Sandbox Code Playgroud)

一些使用的另一个技巧是创建一组“智能构造函数”:

object UserStatus {
  object Active extends UserStatus
  object Deleted extends UserStatus 
  val active: UserStatus = Active
  val deleted: USerStatus = Deleted
}
Run Code Online (Sandbox Code Playgroud)

...它允许你写:

 for {
   u <- slickUsers
   if u.status === UserStatus.active
 } yield u
Run Code Online (Sandbox Code Playgroud)