1 val selectAB = for { 2 a <- tableA 3 b <- tableB 4 if (a.id === b.id) 5 } yield (a.id,b.id,a.status,b.status) 6
7 case class ABRow (id: Int, asts: Int, bsts: Int) 8 def toABRow(raw: (Int,Int,Int,Int)) = ABRow(raw._1,raw._3,raw._4) 9
10 import com.bayakala.funda.rowtypes.DataRowType 11
12 val loader = FDADataRow(slick.driver.H2Driver, toABRow _) 13 loader.getTypedRows(selectAB.result)(db).foreach {dataRow =>
14 println(s"ID:${dataRow.id} Status A = ${dataRow.asts}, B = ${dataRow.bsts}") 15 }
ID:1 Status A = 0, B = 1 ID:2 Status A = 3, B = 2 ID:3 Status A = 1, B = 3 ID:4 Status A = 0, B = 4
1 import com.bayakala.funda.rowtypes.ActionType.FDAAction 2 def updateAStatus(row: ABRow): FDAAction[Int] = { 3 tableA.filter{r => r.id === row.id} 4 .map(_.status) 5 .update(row.asts) 6 } 7
8
9 loader.getTypedRows(selectAB.result)(db).map(updateAStatus(_)).foreach { 10 actionRow =>
11 println(s"${actionRow.toString}") 12 }
slick.driver.JdbcActionComponent$UpdateActionExtensionMethodsImpl$$anon$7@492691d7
slick.driver.JdbcActionComponent$UpdateActionExtensionMethodsImpl$$anon$7@27216cd
slick.driver.JdbcActionComponent$UpdateActionExtensionMethodsImpl$$anon$7@558bdf1f
slick.driver.JdbcActionComponent$UpdateActionExtensionMethodsImpl$$anon$7@8576fa0
1 def execAction(act: FDAAction[Int]) = db.run(act) 2
3 loader.getTypedRows(selectAB.result)(db) 4 .map(updateAStatus(_)) 5 .map(execAction(_))
loader.getTypedRows(selectAB.result)(db).foreach {dataRow => println(s"ID:${dataRow.id} Status A = ${dataRow.asts}, B = ${dataRow.bsts}") } 结果: ID:1 Status A = 1, B = 1 ID:2 Status A = 2, B = 2 ID:3 Status A = 3, B = 3 ID:4 Status A = 4, B = 4
1 package com.bayakala.funda.rowtypes 2
3 import scala.concurrent.duration._ 4 import scala.concurrent.Await 5 import slick.driver.JdbcProfile 6
7 object DataRowType { 8 class FDADataRow[SOURCE, TARGET](slickProfile: JdbcProfile,convert: SOURCE => TARGET){ 9 import slickProfile.api._ 10
11 def getTypedRows(slickAction: DBIO[Iterable[SOURCE]])(slickDB: Database): Iterable[TARGET] =
12 Await.result(slickDB.run(slick