25

私は次の列挙型を持っています:

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
4

4 に答える 4

19

個人的には、独自のクラスを 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)
}

これは slick 1.0 でも動作するはずです (私はテストしていません):

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

列挙型に必要なのは、DBEnum から継承することだけであり、ボイラー プレートの多くを削減する必要があります。

Int の代わりに文字列値を使用する場合は、それに応じてコードを編集します。

于 2013-10-16T18:19:48.350 に答える
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

このようにして、データベースからデータをロードするときに、列挙型に変換されます。値を文字として DB に保存することを主張する場合は、文字にマップするマッパーを作成して、

于 2013-10-09T14:50:39.283 に答える
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)"))
于 2013-10-10T18:30:00.110 に答える