scala - 在Slick中使用自定义列类型时进行过滤

标签 scala slick slick-2.0

使用自定义列类型时,在Slick 2.1.0中查询/过滤时遇到一些困难。
我的问题的简化版本:

import scala.slick.driver.MySQLDriver.simple._

sealed class Status(val intValue: Int)
case object Active extends Status(1)
case object Disabled extends Status(2)
case object Deleted extends Status(3)

case class TableMapping(id: Long, status: Status)

class MyTableDefinition(tag: Tag) extends Table[TableMapping](tag, "sometable") {
  implicit val statusColumnType = MappedColumnType.base[Status, Int](statusToInt, intToStatus)

  def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
  def status = column[Status]("STATUS", O.NotNull, O.Default(Active))
  def * = (id, status) <> (TableMapping.tupled, TableMapping.unapply)

  private def statusToInt(s: Status): Int = s.intValue
  private def intToStatus(i: Int): Status = i match {
    case 1 => Active
    case 2 => Disabled
    case _ => Deleted
  }
}

class MyTableDao {
    val Items = TableQuery[MyTableDefinition]
    def byId(id: Long)(implicit session: Session): Option[TableMapping] = {
      Items.filter(_.status =!= Deleted).firstOption
    }
}

我得到一个编译错误:
Items.filter(_.status =!= Deleted).firstOption

错误状态:
value =!= is not a member of scala.slick.lifted.Column[Status]
[error] def byId(id: Long)(implicit session: Session): Option[TableMapping] =
  Items.filter(_.status =!= Deleted).firstOption

关于我在做什么错的任何想法吗?也许有一种我不知道的更好的方法呢?

最佳答案

事实是,Scala编译器将寻找Deleted.type而不是Status的隐式转换。

由于Deleted声明为object,因此它不是一个类,它的实际类是Deleted.type,因此您只需要帮助编译器了解实际上是Status即可。如何?你可以试试

class MyTableDao {
val Items = TableQuery[MyTableDefinition]

def byId(id: Long)(implicit session: Session): Option[TableMapping] =
    Items.filter(_.status =!= Deleted.asInstanceOf[Status]).firstOption
}

会做的。

让我知道它是否有效,我遇到了类似的问题,并且能够摆脱它。

关于scala - 在Slick中使用自定义列类型时进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30483811/

相关文章:

scala - 插入后如何返回多个值?

scala - slick2.0 : how to make a Table object?

java - Washington OpenIE 4 - 如何将多个文件作为输入传递?

java - 如何在Java类中调用Scala方法

mysql - 设置 connectionPool 会导致 Slick 3.0 崩溃

scala - 你如何在 Slick 中使用带有参数的 StaticQuery.update?

scala - 推断抽象类中的多个泛型类型,这些类型应该可供编译器使用

java - 如何将scala数组[对象]传递给java函数参数

scala - 计算 Spark DataFrame 中非空值的数量

scala - 如何使用 Scala 在路由上绑定(bind)枚举?