gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:52:32 24 4
gpt4 key购买 nike

考虑下面的收藏夹表对象,我们想编写一个查询以按类型(定义如下)查找收藏夹。我们还定义了一个 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]看来 === 不能用于比较 User-defined 类型,这是真的吗?有没有其他方法可以做到这一点?
编辑
相关问题:在我使用没有显式类型的 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]对此的解决方案与下面介绍的解决方案相同

最佳答案

如果对 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只是为了让东西编译( 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
}
}

关于scala - 比较 Slick 查询中的类型映射值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18147396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com