0

我了解在使用诸如Long, Int, Stringetc 之类的类型时这是如何完成的。但是假设我有一个类在另一个类中有字段,如下所示:

case class Foo(a:String, b:String)
case class Bar(foo:Option[Foo], c:String)

Foo我将如何为我的自定义类型(在我的类中)设置映射器Bar

class Bars(tag:Tag) extends Table[Bar](tag, "BARS") {
  def foo = column[Foo]("FOO") // <- won't work
  def c = column[String]("C")

  def * = (foo, c) <> (Bar.tupled, Bar.unapply)
}

文档链接)


更新:

数据库驱动程序:slick.driver.PostgresDriver

光滑 2

我猜原始 SQL 应该是这样的:

"BARS" (
  "A" VARCHAR(254) NOT NULL,
  "B" VARCHAR(254) NOT NULL, 
  "C" VARCHAR(254) NOT NULL
);

应该可以这样调用Bar

val bar = Bar(Foo("1", "2"), "3")
barTable.insert(bar)
bar.foo.a // 1
bar.foo.b // 2
bar.c // 3
4

2 回答 2

1

您可以在案例类和可以存储在数据库中的某些类型之间编写映射器。

在此处查看 Slick 的示例:http: //slick.typesafe.com/doc/1.0.0/lifted-embedding.html,位于页面末尾。

在您的案例中,一种简单的方法可能是将您的案例类转换为 json 并存储为字符串。(如果您的数据库直接支持 json 类型,例如 PostgreSQL,您可以在列映射器中指定 JSON 类型,这将在进行与案例类内容相关的查询时为您提供优势。)

import org.json4s._
import org.json4s.native.Serialization
import org.json4s.native.Serialization.{read, write}

//place this in scope of your table definition
implicit val FooTypeMapper = MappedTypeMapper.base[Foo, String](
  { f => write(f) },    // map Foo to String
  { s => read[Too](s) } // map String to Foo
)

class Bars(tag:Tag) extends Table[Bar](tag, "BARS") {
  def foo = column[Foo]("FOO") // <- should work now
  def c = column[String]("C")

  def * = (foo, c) <> (Bar.tupled, Bar.unapply)
}

使用 PostgreSQL >=9.3,您还可以编写:

def foo = column[Foo]("FOO", O.DBType("json"))

这样数据库才能正确处理您的 json。

更新:如果为 JSON 字段发送字符串,则应设置一个连接属性。像这样的东西:

  val prop = new java.util.Properties
  prop.setProperty("stringtype", "unspecified")

  val db = Database.forURL(<db-uri>,
                           driver="org.postgresql.Driver",
                           user=<username>,
                           password=<password>,
                           prop=prop)
于 2014-07-22T22:55:13.530 回答
1

您需要在 Bars 表中为 A 和 B 提供列:

class Bars(tag:Tag) extends Table[Bar](tag, "BARS") {
  def a = column[String]("A")
  def b = column[String]("B")
  def foo = (a, b) <> (Foo.tupled, Foo.unapply)

  def c = column[String]("C")

  def * = (foo, c) <> (Bar.tupled, Bar.unapply)
}
于 2015-08-10T11:00:14.020 回答