SLICK 3.0.0映射现有模型 [英] Slick 3.0.0 Mapping Existing Models

查看:0
本文介绍了SLICK 3.0.0映射现有模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个模型,由三个案例类组成,如下所示:

case class MyModel(myId: MyIdType, name: MyNameType)

case class MyIdType(id: Long)
case class MyNameType(name: String)
object MyNameType(name: String) {
  val NAME1 = MyNameType("name1")
  val NAME2 = MyNameType("name2")
  val NAME3 = MyNameType("name3")
}

假设这些是现有的模型。我有一个巧妙的表映射,如下所示:

  class MyTable(tag: Tag) extends Table[MyTableElem](tag, "myTable") {
    def id                  = column[Long]("id", O.PrimaryKey)
    def name                = column[String]("name")

    def * = (id, name) <> (MyTableElem.tupled, MyTableElem.unapply)
  }

可以看出,我必须使用另一种类型将表MyTable首先映射到MyTableElem,然后在每次读取时,将MyTableElem转换为MyModel。有没有办法避免这种情况,直接转到MyModel?我想我必须实现元组方法和取消应用方法,或者?

推荐答案

我认为您可能需要定义自己的列类型。在Slick 3.0文档中, MappedTo可用于您的案例。

如果您有某个受支持类型的基础值的包装类(可以是Case类和/或Value类),则可以使其免费扩展MappdTo以获取宏生成的隐式ColumnType。

以下是我尝试解决您的问题的方法。

import slick.lifted.Tag
// I am using PostgreSQL
import slick.driver.PostgresDriver.api._

case class MyModel(myId: MyIdType, name: MyNameType)

case class MyIdType(id: Long) extends MappedTo[Long] {
  override def value: Long = id
}
case class MyNameType(name: String) extends MappedTo[String] {
  override def value: String = name
}

class MyTable(tag: Tag) extends Table[MyModel](tag, "myTable") {
  def id                  = column[MyIdType]("id", O.PrimaryKey)
  def name                = column[MyNameType]("name")

  def * = (id, name) <> (MyModel.tupled, MyModel.unapply)
}

无论如何,希望它能有所帮助。

这篇关于SLICK 3.0.0映射现有模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆