比较Slick查询中的类型映射值

Wel*_*ngr 4 scala slick

考虑下面的收藏夹表对象,我们想要编写一个查询来按类型查找收藏夹(在下面定义).我们还定义了一个Typemapper,将FavoriteType映射到数据库的String

import scala.slick.driver.PostgresDriver.simple._
//Other imports have been omitted in this question

object Favorites extends Table[Favorite]("favorites") {

  // Convert the favoriteTypes to strings for the database
  implicit val favoriteMapping: TypeMapper[FavorietType] = MappedTypeMapper.base[FavorietType, String](
    favType => FavorietType.values.find(_ == favType).get.mapping,
    mapping => FavorietType.values.find(_.mapping == mapping).get
  )

  def favoriteType = column[FavoriteType]("type")
  //other columns here
Run Code Online (Sandbox Code Playgroud)

这是我想写的查询(但是它不能编译)

  def queryByFavoriteType(ftype : FavoriteType)(implicit s: Session) = {
    for(
      f <- Favorieten if  f.favoriteType === ftype
    ) yield f
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我定义了不同的FavoriteType对象(这是在Favorieten对象之外)

sealed case class FavorietType(mapping: String) {
  override def toString = mapping.capitalize
}
object FavoriteType {
  object Exam extends FavoriteType("examen")
  object Topic extends FavoriteType("onderwerp")
  object Paper extends FavoriteType("profielwerkstuk")

  val values = Seq(Exam , Topic , Paper )
}
Run Code Online (Sandbox Code Playgroud)

我在这里遇到的问题是查询无法编译: value === is not a member of scala.slick.lifted.Column[models.gebruiker.FavorietType]

似乎===不能用于比较用户定义的类型,这是真的吗?有没有其他方法可以做到这一点?

编辑

相关问题:在我的TypeMapper没有显式类型之前,它被定义为 implicit val favoriteMapping = MappedTypeMapper.base[FavorietType, String]( ...

当我编写一个可以比较FavoriteType.Exam(例如)的查询时

  def queryByFavoriteExam()(implicit s: Session) = {
    for(f <- Favorieten if f.favorietType === FavorietType.Exam) yield f
  }
Run Code Online (Sandbox Code Playgroud)

这将导致错误.could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[models.gebruiker.FavorietType.Exam.type] 此解决方案与下面给出的解决方案相同

cmb*_*ter 9

如果对Slick有疑问,请查看单元测试.在阅读他们关于自定义类型映射的文档然后查看他们的单元测试之后,我通过将其更改为:来编译您的查询代码:

def queryByFavoriteType(ftype : FavoriteType)(implicit s: Session) = {
  for(f <- Favorites if f.favoriteType === (ftype:FavoriteType)) yield f
}
Run Code Online (Sandbox Code Playgroud)

另外,我导入了H2Driverjust来获取compile(import scala.slick.driver.H2Driver.simple._).我假设您还导入了数据库所需的任何驱动程序.

编辑

我的完整代码示例如下:

import scala.slick.driver.PostgresDriver.simple._
import scala.slick.session.Session

sealed case class FavoriteType(mapping: String) {
  override def toString = mapping.capitalize
}

case class Favorite(ft:FavoriteType, foo:String)
object FavoriteType {
  object Exam extends FavoriteType("examen")
  object Topic extends FavoriteType("onderwerp")
  object Paper extends FavoriteType("profielwerkstuk")

  val values = Seq(Exam , Topic , Paper )
}

object Favorites extends Table[Favorite]("favorites") {
  // Convert the favoriteTypes to strings for the database
  implicit val favoriteMapping = MappedTypeMapper.base[FavoriteType, String](
    {favType => FavoriteType.values.find(_ == favType).get.mapping},
    {mapping => FavoriteType.values.find(_.mapping == mapping).get}
  )

  def favoriteType = column[FavoriteType]("type")
  def foo = column[String]("foo")

  def * = favoriteType ~ foo <> (Favorite.apply _, Favorite.unapply _)

  def queryByFavoriteType(ftype : FavoriteType)(implicit s: Session) = {
    for(f <- Favorites if f.favoriteType === (ftype:FavoriteType)) yield f
  }   
}
Run Code Online (Sandbox Code Playgroud)