In Slick 3.0, how to get from a request to the case class?

I am trying to use Slick for a database in a Scala application and run some problems (or my misunderstandings) on how to query (find) and convert the result to the case class.

I do not map the case class, but the actual values ​​in order to create the case class on the fly. so my table:

object Tables {

  class Names(tag: Tag) extends Table[Name](tag, "NAMES") {
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
        def first = column[String]("first")
        def middle = column[String]("last")
        def last = column[String]("last")

        def * = (id.?, first, middle.?, last) <> ((Name.apply _).tupled, Name.unapply)
  }

  object NamesQueries {

    lazy val query = TableQuery[Names]

    val findById = Compiled { k: Rep[Long] =>
      query.filter(_.id === k)
    }
  }
}

and here is the request:

object NamesDAO {

  def insertName(name: Name) {
    NamesQueries.query += name.copy(id = None)
  }

  def findName(nameId: Long) = {
    val q = NamesQueries.findById(nameId)                         // AppliedCompiledFunction[Long, Query[Tables.Names, Tables.Names.TableElementType, Seq],Seq[Tables.Names.TableElementType]]
    val resultSeq = Database.forConfig("schoolme").run(q.result)  // Future[Seq[Tables.Names.TableElementType]]
    val result = resultSeq.map { r =>                             // val result: Future[(Option[Long], String, Option[String], String) => Name]
      val rr = r.map{ name =>                                     // val rr: Seq[(Option[Long], String, Option[String], String) => Name]
        Name.apply _
      }
      rr.head
    }
    result
  }
}

however, the findName method returns Future((Option[Long], String, Option[String], String) => Name)instead Future(Name). What am I doing wrong? Is this just a usage issue asInstanceOf[Name]?

EDIT: An extended findName for smaller snippets with comments for each, as suggested by sap1ens.

+4
source share
1 answer

, . sap1ens , findName ( ). val , . . :

  def findName(nameId: Long) = {
    val q = NamesQueries.findById(nameId)                        
    val resultSeq: Future[Seq[Name]] = Database.forConfig("schoolme").run(q.result)  
    val result = resultSeq.map { r =>
      val rr = r.map{ name =>
        name
      }
      rr.head
    }
    result
  }

(/my). , .

0

All Articles