as) <> (toPerson,fromPerson) 54 } 55 val tupleMappedPerson = TableQuery[TupleMappedPerson] 56
57 Await.result(db.run(tupleMappedPerson.result),Duration.Inf).foreach {row =>
58 println(s"${row.id.get} ${row.name} ${row.alias.getOrElse("")}, ${row.age}") 59 } 60
61 def hlistToPerson(hl: Option[Int]::String::Int::(Option[String])::HNil) =
62 new Person(hl(0),hl(1),hl(2),hl(3)) 63 def personToHList(p: Person) = Some(p.id::p.name::p.age::p.alias::HNil) 64 class HListPerson(tag: Tag) extends Table[Person](tag,"PERSON") { 65 def id = column[Int]("id",O.PrimaryKey,O.AutoInc) 66 def name = column[String]("name") 67 def age = column[Int]("age") 68 def alias = column[Option[String]]("alias") 69 def * = (id.?)::name::age::alias::HNil <> (hlistToPerson,personToHList) 70 } 71 val hlistPerson = TableQuery[HListPerson] 72 Await.result(db.run(hlistPerson.result),Duration.Inf).foreach {row =>
73 println(s"${row.id.get} ${row.name} ${row.alias.getOrElse("")}, ${row.age}") 74 } 75
76 case class YR(name: String, yr: Int) 77
78 val qYear = for { 79 p <- hlistPerson 80 } yield ((p.name, p.age) <> (YR.tupled,YR.unapply)) 81
82 Await.result(db.run(qYear.result),Duration.Inf).foreach {row =>
83 println(s"${row.name} ${row.yr}") 84 } 85
86 case class Title(id: Int, title: String) 87 class PersonTitle(tag: Tag) extends Table[Title](tag,"TITLE") { 88 def id = column[Int]("id") 89 def title = column[String]("title") 90 def * = (id,title) <> (Title.tupled,Title.unapply) 91 } 92 val personTitle = TableQuery[PersonTitle] 93 val createTitleAction = personTitle.schema.create 94 Await.ready(db.run(createTitleAction),Duration.Inf) 95 val initTitleData = DBIO.seq { 96 personTitle ++= Seq( 97 Title(1,"Manager"), 98 Title(2,"Programmer"), 99 Title(3,"Clerk") 100 ) 101 } 102 Await.ready(db.run(initTitleData),Duration.Inf) 103
104 case class Titles(id: Int, name: String, title: String) 105 val qPersonWithTitle = for { 106 p <- hlistPerson 107 t <- personTitle if p.id === t.id 108 } yield ((p.id,p.name,t.title) <> (Titles.tupled,Titles.unapply)) 109 Await.result(db.run(qPersonWithTitle.result),Duration.Inf).foreach {row =>
110 println(s"${row.id} ${row.name}, ${row.title}") 111 } 112
113
114 }
|