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

时间:2014-11-14 11:46:01

标签: scala slick

我理解嵌套类可以很好地与Slick配合使用,我们可以在我们的产品中使用它。当嵌套类是可选的时,我们面临一个问题。例如,请查看以下代码

   class EmpTable(tag: Tag) extends Table[Emp](tag, "emp") {
     def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
     def name = column[String]("name")
     def aId = column[Option[Int]]("a_id")
     def location = column[Option[String]]("address")
     def address = (aId, location) <> (Address.tupled, Address.unapply)

     def * = (id, name, address.?) <> (Emp.tupled, Emp.unapply)


  }

case class Emp(id: Int, name: String, address: Option[Address])

case class Address(aId: Option[Int], location: Option[String])

此代码无法编译,因为地址没有方法? 。 是否有一种简单的方法可以使其正常工作?

1 个答案:

答案 0 :(得分:2)

我得到了一个解决方案:

class EmpTable(tag: Tag) extends Table[Emp](tag, "emp") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def aId = column[Option[Int]]("a_id")
  def location = column[Option[String]]("address")
  def * = (id, name, address, auth) <> (Emp.tupled, Emp.unapply)

  def address = (aId, location).<>[Option[Address], (Option[Int], Option[String])]({ ad:        (Option[Int], Option[String]) =>
  ad match {
    case (Some(id), Some(loc)) => Some(Address(id, loc))
    case _ => None
  }
}, {
  adObj: Option[Address] =>
    adObj match {
      case add: Option[Address] => Some((add.map(_.aId), add.map(_.location)))

    }
})