scala – 在Slick中使用自定义列类型时进行过滤
发布时间:2020-12-16 19:13:31 所属栏目:安全 来源:网络整理
导读:使用自定义列类型时,我在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
使用自定义列类型时,我在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被声明为一个对象,它不是一个类,它的实际类是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 } 那就行了. 让我知道如果它确实有效,我面临着类似的问题,我能够摆脱它这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |