/ / Slick 3.0.0 Mapovanie existujúcich modelov - scala, slick

Slick 3.0.0 Mapovanie existujúcich modelov - scala, slick

Mám model, ktorý sa skladá z troch tried prípadov, ako je uvedené nižšie:

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")
}

Povedzme, že ide o existujúce modely.Mám mapovanie Slick tabuľky, ktoré ide takto:

  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)
}

Ako možno vidieť, že musím mať ďalšietyp pre mapovanie môjho tabuľky MyTable najprv do MyTableElem a potom počas každého čítania transformujem MyTableElem na MyModel. Existuje spôsob, ako sa tomu vyhnúť a ísť priamo do modelu MyModel? Myslím, že musím implementovať metódy tupled a unapply alebo?

odpovede:

1 pre odpoveď č. 1

Myslím, že možno budete musieť definovať svoj vlastný typ stĺpca. V dokumentácii Slick 3.0 Použitie vlastných skalárnych typov v dopytoch, MappedTo mohli byť použité vo vašom prípade.

Ak máte triedu obalov (ktorá môže byť voliteľnebyť trieda prípadov a / alebo trieda hodnôt) pre podkladovú hodnotu niektorého podporovaného typu, môžete rozšíriť MappedTo tak, aby ste získali makro-generovaný implicitný ColumnType zadarmo.

Nasleduje, ako sa pokúšam vyriešiť váš problém.

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)
}

Každopádne dúfam, že to pomôže.