Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala SLICK中带有伴生对象的映射投影_Scala_Slick - Fatal编程技术网

Scala SLICK中带有伴生对象的映射投影

Scala SLICK中带有伴生对象的映射投影,scala,slick,Scala,Slick,我有嵌套的类/对象,希望使用SLICK将它们存储(和检索)到数据库中。我知道用光滑的贴图投影将是关键。此外,我还使用一个伴生对象在嵌套对象和平面结构(存储在DB表中)之间进行映射。我想这样做(简化示例): case类Foo(id:Int,myBar:Bar) 案例类栏(myInt:Int,myString:String) 对象Foo{ def apply(id:Int,myInt:Int,myString:String):Foo=Foo(id,Bar(myInt,myString)) 取消应用覆

我有嵌套的类/对象,希望使用SLICK将它们存储(和检索)到数据库中。我知道用光滑的贴图投影将是关键。此外,我还使用一个伴生对象在嵌套对象和平面结构(存储在DB表中)之间进行映射。我想这样做(简化示例):

case类Foo(id:Int,myBar:Bar)
案例类栏(myInt:Int,myString:String)
对象Foo{
def apply(id:Int,myInt:Int,myString:String):Foo=Foo(id,Bar(myInt,myString))
取消应用覆盖def(f:Foo)=(f.id,f.myBar.myInt,f.myBar.myString)
}
对象TTable扩展表[Foo](“Foo”){
def id=列[Int](“id”,O.PrimaryKey)
def myInt=列[Int](“myInt”,O NotNull)
def myString=列[String](“myString”,O NotNull)
def*=id~myInt~myString(Foo.apply,Foo.unapply)
def查询(db:Database,id:Int):Option[Foo]=db with Session{//s:Session=>

(对于{b而不是
不应用
应用
,您只需传入lambda即可:

  def * = id ~ myInt ~ myString <> (
    (id,myInt,myString) => Foo(id, Bar(myInt, myString)),    /* from a row to a Foo */
    (f:Foo) => Some((f.id, f.myBar.myInt, f.myBar.myString)) /* and back */)
如果要执行
def*=id~myInt~myString(Foo.apply,Foo.unapply)

在某种程度上,您会得到类似case类的用法,但您可能会错过其他好东西 与实际案例类一样,免费使用
等于
toString
。 我宁愿保留case类(以及它们的默认值
apply
unapply
),这样它们就可以在常规约定中被视为代数数据类型

这里真正的问题是case类有自己的
不适用
,因此(据我所知)在您的同伴类中不能有类似的方法(相同的名称和相同的参数)。 您可以简单地使用另一个方法名,毕竟,您不想这样做 语义上等同于
unapply
无论如何:

object Foo {
  def fromRow(id: Int, myInt: Int, myString: String): Foo = Foo(id, Bar(myInt, myString))
  def toRow(f: Foo) = Some((f.id, f.myBar.myInt, f.myBar.myString))
}
然后在表架构中:

def * = id ~ myInt ~ myString <> (Foo.fromRow _, Foo.toRow _)
def*=id~myInt~myString(Foo.fromRow,Foo.toRow)

非常感谢。事实上,我更喜欢您的第一个解决方案,它工作得非常好。但是,有大约12个参数,整个映射似乎都是样板。我知道SLICK的直接嵌入将更加紧凑,但还不允许插入。我期待着看到SLICK在这方面的进展。即使您能够要使
应用
不应用
它们符合您在问题中描述的方式,您仍然需要处理几十个参数,对吗?FWIW,看看我的上一次编辑。通过案例类和上一次编辑,我得到了“对重载定义的模糊引用”方法“apply”出错。因此,我不得不将同伴对象中的方法重命名为“fromRow”。如何在slick 2中执行第一个选项?
object Foo {
  def fromRow(id: Int, myInt: Int, myString: String): Foo = Foo(id, Bar(myInt, myString))
  def toRow(f: Foo) = Some((f.id, f.myBar.myInt, f.myBar.myString))
}
def * = id ~ myInt ~ myString <> (Foo.fromRow _, Foo.toRow _)