如何在浮油中保持枚举值

Lon*_*ngo 24 scala slick

我有以下枚举:

object LoginStatus extends Enumeration() with BitmaskedEnumeration {
  type LoginStatus = Value
  val Active = Value("A")
  val Inactive = Value("I")
}
Run Code Online (Sandbox Code Playgroud)

我需要保持枚举"A"的值,但是当生成sql时,结果为0.这是表映射:

object LoginTable extends Table[Login]("login") {
  def idLogin = column[Int]("idlogin", O.PrimaryKey, O.AutoInc)
  def cdLogin = column[String]("cdlogin", O.NotNull)
  def cdPass = column[String]("cdPass", O.NotNull)
  def stLogin = column[LoginStatus]("stlogin", O.NotNull, O.DBType("character(1)"))
}
Run Code Online (Sandbox Code Playgroud)

如何持久化枚举值?

我实施了

implicit val charMapper = MappedTypeMapper.base[Char, String](
    b => b.toString(),
    i => i.charAt(0))

  implicit def enum2StringMapper(enum: Enumeration) = MappedTypeMapper.base[enum.Value, Char](
    b => b.toString.charAt(0),
    i => enum.withName(i.toString))

  implicit val LoginStatusMapper = enum2StringMapper(LoginStatus)
Run Code Online (Sandbox Code Playgroud)

但结果是:

[error] c.Login - Invalid value for type int : A
Run Code Online (Sandbox Code Playgroud)

pra*_*nov 18

我个人建议让你自己的类继承自Scala的Enumeration类,因为你不必为最终使用的每个枚举创建映射器:

这是我目前使用的光滑的2.0代码:

abstract class DBEnum extends Enumeration {

  import slick.jdbc.MappedJdbcType
  import slick.driver.JdbcDriver.simple._

  implicit val enumMapper = MappedJdbcType.base[Value, Int](_.id, this.apply)
}
Run Code Online (Sandbox Code Playgroud)

这应该也适用于光滑的1.0(我还没有测试过):

abstract class DBEnum extends Enumeration {
  implicit val enumMapper = MappedTypeMapper.base[Value, Int](_.id, this.apply)
}
Run Code Online (Sandbox Code Playgroud)

现在你所需要的只是继承DBEnum,它应该减少很多锅炉板.

如果要使用字符串值而不是Ints,请相应地编辑代码.

  • 请注意,由于https://github.com/slick/slick/issues/540,此代码似乎不适用于当前版本.你得到错误`JdbcProfile没有类型scala.slick.driver.JdbcTypesComponent $ MappedJdbcType的TypeInfo ...`要解决这个问题,请将导入更改为您的特定数据库驱动程序,而不是'jdbc'.例如`import scala.slick.driver.HsqldbDriver.simple._`和`import scala.slick.driver.HsqldbDriver.MappedJdbcType` (5认同)
  • 如果你更喜欢traits:trait EnumMapper {this:Enumeration => implicit val enumMapper = MappedColumnType.base [Value,Int](_.id,this.apply)} (2认同)