考虑下面的收藏夹表对象,我们要编写一个查询来按其类型(定义如下)查找收藏夹。我们还定义了一个 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
这是我想写的查询(但它不编译)
def queryByFavoriteType(ftype : FavoriteType)(implicit s: Session) = {
for(
f <- Favorieten if f.favoriteType === ftype
) yield f
}
}
这里我定义了不同的 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 )
}
我在这里遇到的问题是查询无法编译:
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
}
这将导致错误could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[models.gebruiker.FavorietType.Exam.type]
此问题的解决方案与下面提供的解决方案相同