Scala - Slick - Получение TypedType для обёрнутого Option [T] - PullRequest
2 голосов
/ 11 марта 2019

Обычно пользовательские идентификаторы создаются следующим образом:

case class CustomID(value: Int) extends MappedTo[Int]

и для представления пользовательских идентификаторов, допускающих обнуление, с типами, такими как Option [CustomID].Тем не менее, я хотел бы иметь возможность переместить Option [_] в класс case, например:

case class OptCustomID(optValue: Option[Int])

Чтобы быть более конкретным, я ищу TypedType [OptCustomId], который ведет себя как встроенный-in TypedType [Option [Int]], что касается базы данных DDL.

Есть идеи?

1 Ответ

0 голосов
/ 12 марта 2019

На самом деле вам не нужно TypedType[OptCustomId]. Правильный способ обработки таблицы с полем типа OptCustomID описан на странице http://slick.lightbend.com/doc/3.3.0/userdefined.html

  import slick.jdbc.PostgresProfile.api._

  case class OptCustomID(optValue: Option[Int])
  case class LiftedOptCustomID(optValue: Rep[Option[Int]])
  implicit object OptCustomIDShape extends CaseClassShape(LiftedOptCustomID, OptCustomID)

  case class Thing(id: OptCustomID, data: String)
  case class LiftedThing(id: LiftedOptCustomID, data: Rep[String])
  implicit object ThingShape extends CaseClassShape(LiftedThing.tupled, Thing.tupled)

  class ThingTable(tag: Tag) extends Table[Thing](tag, "things") {
    def id = column[Option[Int]]("id", O.PrimaryKey)
    def data = column[String]("data")
    def * = LiftedThing(LiftedOptCustomID(id), data)
  }

  val things = TableQuery[ThingTable]
  val result: DBIO[Option[Thing]] = things.filter(x => x.id === 1).result.headOption
...