在Scala和Slick之间的枚举映射

13

我是Play Scala和Slick的新手。我试图将Scala上的枚举映射到Slick上的字符串/整数。我编写了以下代码,但遇到了错误。请问如何修复它?

我正在使用Scala 2.11.6,Slick 3.1.0,Play 2.4.4,play-slick 1.1.1。

package models

import javax.inject.{Inject, Singleton}

import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile

import scala.concurrent.ExecutionContext

class Color extends Enumeration {
  type Color = Value
  val Blue = Value("Blue")
  val Red = Value("Red")
  val Green = Value("Green")
}
object Color extends Color

case class Sample(name:String, id:Int, c:Color)

@Singleton
class ColorDao @Inject()(dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {
  val dbConfig = dbConfigProvider.get[JdbcProfile]
  import dbConfig._
  import driver.api._

  class SampleTable(tag: Tag) extends Table[Sample](tag, "Sample") {
    def name  = column[String]("NAME")
    def id    = column[Int]("ID")
    def color = column[Color]("COLOR")
    def * = (name, id, color) <> (Sample.tupled, Sample.unapply)
  }

  def enumStringMapper(enum: Enumeration) = MappedColumnType.base[enum.Value, String](
    e => e.toString,
    s => enum.withName(s)
  )
  implicit val colorMapper = enumStringMapper(Color)
}

我收到了以下错误。

[error] /Users/yohei/IdeaProjects/slick3-enum-
mapping/app/models/Sample.scala:30:
could not find implicit value for parameter tt:
slick.ast.TypedType[models.Color]
[error]     def color = column[Color]("COLOR")
[error]                              ^
请参阅以下链接以获取完整代码:

https://github.com/yohei1126/slick3-enum-mapping


使用此代码进行修复。

--

package models

import javax.inject.{Inject, Singleton}

import models.Bar.Bar
import models.Color.Color
import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile

import scala.concurrent.ExecutionContext

object Color extends Enumeration {
  type Color = Value
  val Blue = Value("Blue")
  val Red = Value("Red")
  val Green = Value("Green")
}

case class Sample(name:String, id:Int, c:Color)

@Singleton
class ColorDao @Inject()(dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {
  val dbConfig = dbConfigProvider.get[JdbcProfile]
  import dbConfig._
  import driver.api._

  class SampleTable(tag: Tag) extends Table[Sample](tag, "Sample") {
    def name  = column[String]("NAME")
    def id    = column[Int]("ID")
    def color = column[Color]("COLOR")
    def * = (name, id, color) <> (Sample.tupled, Sample.unapply)
  }
  implicit val colorMapper = MappedColumnType.base[Color, String](
    e => e.toString,
    s => Color.withName(s)
  )
}

使用第二段代码进行修复。 - Yohei Onishi
如果您回答自己的问题并接受它,那么会更清晰 :) - stsatlantis
我认为@stsatlantis的意思是将修复方法作为实际的SO答案发布...已经在这里完成。 - Valy Dia
1个回答

4

这里是解决方法:

package models

import javax.inject.{Inject, Singleton}

import models.Bar.Bar
import models.Color.Color
import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile

import scala.concurrent.ExecutionContext

object Color extends Enumeration {
  type Color = Value
  val Blue = Value("Blue")
  val Red = Value("Red")
  val Green = Value("Green")
}

case class Sample(name:String, id:Int, c:Color)

@Singleton
class ColorDao @Inject()(dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {
  val dbConfig = dbConfigProvider.get[JdbcProfile]
  import dbConfig._
  import driver.api._

  class SampleTable(tag: Tag) extends Table[Sample](tag, "Sample") {
    def name  = column[String]("NAME")
    def id    = column[Int]("ID")
    def color = column[Color]("COLOR")
    def * = (name, id, color) <> (Sample.tupled, Sample.unapply)
  }
  implicit val colorMapper = MappedColumnType.base[Color, String](
    e => e.toString,
    s => Color.withName(s)
  )
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接