Slick 2.0中的地图继承

乔凡尼·席尔瓦(Giovanni Silva)

我知道堆栈溢出中还有其他问题,但是没有一个对我有用。

我正在尝试在光滑的投影中映射一个简单的继承

我尝试了数百种组合,但无法进行此编译。我以下面的代码和下面的错误结尾。

我简化了案例类,因为它们有更多的数据。没有继承,我的其他层(控制器,服务和接口)将不得不处理复杂性,因为在这种情况下,该模型表示三重继承的真实对象,因此没有更好的表示方法来表示此类的继承。在服务和控制器层中,我使类的Json表示符合我的需要,我可以发送和使用表示我的模型的Json API,唯一的方式是将这种表示形式保留在关系数据库中,即我的关系模型能够在单个表继承中持久化此实体,但是将行转换为关系型却很痛苦。

我正在使用scala 2.10.3 + sbt 0.13.1

abstract class Pessoa2(val nome:String, val tipo:String)
case class PessoaFisica2(override val nome:String, val cpf:String) extends Pessoa2(nome,"F")
case class PessoaJuridica2(override val nome:String, val cnpj:String) extends Pessoa2(nome, "J")

class PessoaTable(tag: Tag) extends Table[Pessoa2](tag, "PESSOAS"){
//    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
def nome = column[String]("nome")
def tipo = column[String]("tipo")
def cpf = column[String]("CPF", O.Nullable)
def cnpj = column[String]("CNPJ", O.Nullable)

def * = (nome, tipo, cpf.?, cnpj.?) <> ({
      case (nome:String,"F",cpf:Option[String],_) => new PessoaFisica2(nome, cpf.get):Pessoa2
      case (nome:String,"J",_,cnpj:Option[String]) => new PessoaJuridica2(nome, cnpj.get):Pessoa2
    },{
    case PessoaFisica2(nome, Some(cpf)) => Some((nome, "F", cpf, ""))
    case PessoaJuridica2(nome, Some(cnpj)) => Some((nome, "J", "", cnpj))
  })
}

这以错误结束:

匿名函数的参数类型必须是完全已知的。(SLS 8.5)[错误]预期类型为:?=>?

[错误] def * =(名称,类型,cpf。?,cnpj。?)<>({

[错误] ^

[错误] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:158:类型不匹配;

发现[错误]:任何

[错误]必需:字符串

[错误]大小写(名称,“ F”,cpf,_)=>新的PessoaFisica2(名称,cpf):Pessoa2

[错误] ^

[错误] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:158:类型不匹配;

发现[错误]:任何

[错误]必需:字符串

[错误]大小写(名称,“ F”,cpf,_)=>新的PessoaFisica2(名称,cpf):Pessoa2

[错误] ^

[错误] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:159:类型不匹配;

发现[错误]:任何

[错误]必需:字符串

[错误]情况(名称,“ J”,_,cnpj)=>新的PessoaJuridica2(名称,cnpj):Pessoa2

[错误] ^

[错误] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:159:类型不匹配;

发现[错误]:任何

[错误]必需:字符串

[错误]情况(名称,“ J”,_,cnpj)=>新的PessoaJuridica2(名称,cnpj):Pessoa2

[错误] ^

[错误] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:160:缺少扩展功能的参数类型

[错误]匿名函数的参数类型必须是完全已知的。(SLS 8.5)

[错误]预期类型为:=>选项[?]

[错误]},{

[错误] ^

[错误] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:157:找不到匹配的Shape。

[错误] Slick不知道如何映射给定的类型。

[错误]可能的原因:表[T]中的T与您的*投影不匹配。或者,您在查询中使用了不受支持的类型(例如,scala列表)。

[错误]必需级别:scala.slick.lifted.ShapeLevel.Flat

[错误]源类型:(scala.slick.lifted.Column [String],scala.slick.lifted.Column [String],scala.slick.lifted.Column [Option [String]],scala.slick.lifted.Column [Option [String]])

[错误]解压缩类型:(字符串,字符串,字符串,字符串)

[错误]打包类型:任意

[错误] def * =(名称,类型,cpf。?,cnpj。?)<>({

[错误] ^

[错误]找到7个错误

用户名

试试看:

abstract class Pessoa2(val nome:String, val tipo:String)
case class PessoaFisica2(override val nome:String, val cpf:String) extends Pessoa2(nome,"F")
case class PessoaJuridica2(override val nome:String, val cnpj:String) extends Pessoa2(nome, "J")


class PessoaTable(tag: Tag) extends Table[Pessoa2](tag, "PESSOAS"){
//    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
def nome = column[String]("nome")
def tipo = column[String]("tipo")
def cpf = column[String]("CPF", O.Nullable)
def cnpj = column[String]("CNPJ", O.Nullable)

def * = (nome, tipo, cpf.?, cnpj.?) <> ({ t : (String, String, Option[String], Option[String])=> t match{
    case (nome:String,"F",cpf:Option[String],_) => new PessoaFisica2(nome, cpf.get):Pessoa2
    case (nome:String,"J",_,cnpj:Option[String]) => new PessoaJuridica2(nome, cnpj.get):Pessoa2
  }},{ k: Pessoa2 => k match{
    case PessoaFisica2(nome, cpf) => Some((nome, "F", Some(cpf), Some(""))): Option[(String, String, Option[String], Option[String])]
    case PessoaJuridica2(nome, cnpj) => Some((nome, "J", Some(""), Some(cnpj))): Option[(String, String, Option[String], Option[String])]
  }})
}

它应该这样编译

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Slick 2:使用Play框架删除Slick中的行

来自分类Dev

Slick 2:使用Play框架删除Slick中的行

来自分类Dev

如何使查询在slick2中列出?

来自分类Dev

从Slick2D中的文本文件加载平铺地图

来自分类Dev

slick 2.0.0-M2:如何定义自定义类型(slick 1.0.0中的MappedTypeMapper)?

来自分类Dev

slick 2.0.0-M2:如何定义自定义类型(slick 1.0.0中的MappedTypeMapper)?

来自分类Dev

Scala Slick表继承

来自分类Dev

在Slick2D中多边形的定位

来自分类Dev

在Slick2D中多边形的定位

来自分类Dev

Java slick2D,与Tiled碰撞(地图编辑器)

来自分类Dev

Java-Slick2D TileD地图正在渲染但未显示

来自分类Dev

向Java / Slick2D中的鼠标位置射击项目符号

来自分类Dev

我如何在Java游戏库(Slick2D)中同时使用运动和动画

来自分类Dev

如何在Slick2D中从其中心绘制旋转的图像?

来自分类Dev

如何在slick2D Java游戏库中播放声音和音乐?

来自分类Dev

在Slick中执行SQL转换

来自分类Dev

在Slick中自动生成UUID

来自分类Dev

在Slick 3.0中处理连接

来自分类Dev

流资源(Slick2D)

来自分类Dev

Scala Slick 2加入多个领域?

来自分类Dev

Slick2D:StateBasedGame并创建菜单

来自分类Dev

将瓷砖与Slick2D结合

来自分类Dev

使用Slick2D滚动背景

来自分类Dev

如何使用LWJGL和Slick2D将图像添加到已绘制的框中

来自分类Dev

在Slick中使用DB Function(TRIM(列中的LEADING'0'))

来自分类Dev

在Slick 3.x中捕获异常

来自分类Dev

groupBy方法在Slick中引发错误

来自分类Dev

Slick 2.1.0中的可选嵌套映射实体

来自分类Dev

Slick中的动态查询参数(排序)