我知道堆栈溢出中还有其他问题,但是没有一个对我有用。
我正在尝试在光滑的投影中映射一个简单的继承
我尝试了数百种组合,但无法进行此编译。我以下面的代码和下面的错误结尾。
我简化了案例类,因为它们有更多的数据。没有继承,我的其他层(控制器,服务和接口)将不得不处理复杂性,因为在这种情况下,该模型表示三重继承的真实对象,因此没有更好的表示方法来表示此类的继承。在服务和控制器层中,我使类的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] 删除。
我来说两句