我有以下枚举:
object LoginStatus extends Enumeration() with BitmaskedEnumeration {
type LoginStatus = Value
val Active = Value("A")
val Inactive = Value("I")
}
我需要保持枚举“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)"))
}
如何持久化枚举值?
我实施了
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)
但结果是:
[error] c.Login - Invalid value for type int : A
答案 0 :(得分: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)
}
这也适用于光滑的1.0(我还没有测试过):
abstract class DBEnum extends Enumeration {
implicit val enumMapper = MappedTypeMapper.base[Value, Int](_.id, this.apply)
}
现在你所需要的只是从DBEnum继承,它应该减少很多锅炉板。
如果要使用字符串值而不是Ints,请相应地编辑代码。
答案 1 :(得分:4)
也许您可以为枚举类型创建一个TypeMapper:
implicit val LoginStatusTypeMapper = MappedTypeMapper.base[LoginStatus.Value, Int]( // conversion from LoginStatus to int { status => status.id }, // conversion back from int to enum { id => LoginStatus(id) } )
然后您需要将您的列引用为:
columnLoginStatus.Value
这样,当您从数据库加载数据时,它将转换回您的枚举。如果您坚持将值存储为数据库中的字符,则只需创建映射到字符的映射器并定义
答案 2 :(得分:2)
经过一些帮助后,我找到了解决方案,枚举:
object LoginStatus extends Enumeration {
def enum2StringMapper(enum: Enumeration) = MappedTypeMapper.base[enum.Value, String](
b => b.toString,
i => enum.withName(i))
implicit val LoginStatusMapper = enum2StringMapper(LoginStatus)
type LoginStatus = Value
val Active = Value("A")
val Inactive = Value("I")
}
和表格映射:
import constants.LoginStatus._
...
def stLogin = column[LoginStatus]("stlogin", O.NotNull, O.DBType("character(1)"))