Наследование карт в слик 2.0

Я знаю, что есть другие вопросы по переполнению стека, но ни один из них не работает для меня.

Я пытаюсь отобразить простое наследование в скользкой проекции

Я пробую сотни комбинаций, я не могу сделать эту компиляцию. Я заканчиваю следующим кодом и ошибкой ниже.

Я упрощаю тематические классы, потому что у них гораздо больше данных. Без наследования мои другие уровни (контроллеры, сервисы и интерфейс) будут иметь дело со сложностью, потому что в этом случае модель представляет реальные объекты, которые наследуются в виде триста, нет лучшего представления, чем наследование для этих классов. На уровне сервисов и контроллеров я заставляю 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 * = (nome, tipo, cpf.?, cnpj.?) <> ({

[ошибка] ^

[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:158: несоответствие типов;

[ошибка] найдена: любая

[ошибка] требуется: строка

[error] case (nome, "F", cpf, _) => new PessoaFisica2 (nome, cpf): Pessoa2

[ошибка] ^

[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:158: несоответствие типов;

[ошибка] найдена: любая

[ошибка] требуется: строка

[error] case (nome, "F", cpf, _) => new PessoaFisica2 (nome, cpf): Pessoa2

[ошибка] ^

[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:159: несоответствие типов;

[ошибка] найдена: любая

[ошибка] требуется: строка

[error] case (nome, "J", _, cnpj) => new PessoaJuridica2 (nome, cnpj): Pessoa2

[ошибка] ^

[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:159: несоответствие типов;

[ошибка] найдена: любая

[ошибка] требуется: строка

[error] case (nome, "J", _, cnpj) => new PessoaJuridica2 (nome, 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: не найдено подходящей фигуры.

[ошибка] Слик не знает, как сопоставить данные типы.

[ошибка] Возможные причины: T в таблице [T] не соответствует вашей * проекции. Или вы используете неподдерживаемый тип в Query (например, Scala List).

[ошибка] Требуемый уровень: 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. [Вариант [String]])

[ошибка] Распакованный тип: (строка, строка, строка, строка)

[ошибка] Тип упаковки: Любой

[ошибка] def * = (nome, tipo, cpf.?, cnpj.?) <> ({

[ошибка] ^

[ошибка] 7 найденных ошибок

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.?) <> ({ 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])]
  }})
}

Это должно скомпилировать таким образом

Другие вопросы по тегам