【问题标题】:Custom Mapped Column Types In Slick Table Definition光滑表定义中的自定义映射列类型
【发布时间】:2014-01-21 16:08:19
【问题描述】:

我有一个枚举类型 ResourceType,我试图使用 slick API 将它作为 Int 存储在数据库中。我已经为 ResourceType 定义了一个自定义类型映射器,但是我在表定义中对 * 的定义出现编译器错误,提示“找不到匹配的形状。Slick 不知道如何映射给定的类型。”。是否有可能完成这项工作?

import scala.slick.driver.H2Driver.simple._

case class Resource(val id : Option[Int], val creationDate : Date, val title : String, val resourceType : ResourceType, val description : String) {
}

case class ResourceType private(val databaseCode : Int, val label : String) {
}

object ResourceType {
  val lessonPlan = new ResourceType(1, "Lesson Plan")
  val activity = new ResourceType(2, "Activity")

  val all = scala.collection.immutable.Seq(lessonPlan, activity)

  private val _databaseCodeMap = all.map(t => t.databaseCode -> t).toMap

  def apply(databaseCode : Int) = _databaseCodeMap(databaseCode)
}

class ResourceTable(tag : Tag) extends Table[Resource](tag, "Resource") {
  def id = column[Option[Int]]("ID", O.PrimaryKey, O.AutoInc)
  def creationDate = column[Date]("CreationDate")
  def title = column[String]("Title")
  def resourceType = column[Int]("ResourceType")
  def description = column[String]("Description")

  implicit val resourceTypeTypeMapper = MappedColumnType.base[ResourceType, Int](_.databaseCode, ResourceType(_))

  //Compile error on this line
  def * = (id, creationDate, title, resourceType, description) <> (Resource.tupled, Resource.unapply)
}

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    resourceType 列的类型必须为 ResourceType。所以试试

    def resourceType = column[ResourceType]("ResourceType")
    

    您可能必须将类型映射器隐式移动到列定义上方。

    【讨论】:

    • 谢谢。我误以为 coumn 的类型参数必须是与底层 SQL 表的数据类型对应的原始类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2012-12-23
    • 2011-01-24
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多