考虑下面的收藏夹表对象,我们想要编写一个查询来按类型查找收藏夹(在下面定义).我们还定义了一个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 ===不是scala.slick.lifted.Column [models.gebruiker.FavorietType]的成员
似乎===不能用于比较用户定义的类型,这是真的吗?有没有其他方法可以做到这一点?
编辑
相关问题:在我的TypeMapper没有显式类型之前,它被定义为隐式val favoriteMapping = MappedTypeMapper.base [FavorietType,String](…
当我编写一个可以比较FavoriteType.Exam(例如)的查询时
def queryByFavoriteExam()(implicit s: Session) = { for(f <- Favorieten if f.favorietType === FavorietType.Exam) yield f }
这将导致错误无法找到scala.slick.lifted.TypeMapper类型的证据参数的隐式值[models.gebruiker.FavorietType.Exam.type]
对此的解决方案与下面给出的解决方案相同
解决方法
当对Slick,go check out the unit tests有疑问时.在阅读他们关于自定义类型映射的文档然后查看他们的单元测试之后,我通过将其更改为以下内容来编译您的查询代码:
def queryByFavoriteType(ftype : FavoriteType)(implicit s: Session) = { for(f <- Favorites if f.favoriteType === (ftype:FavoriteType)) yield f }
另外,我导入了H2Driver只是为了编译(导入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,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 } }