scala – Slick 3.0.0选择并创建或更新
发布时间:2020-12-16 08:44:28 所属栏目:安全 来源:网络整理
导读:我的情况是,我必须首先选择,使用该值来发布创建.这是我试图实现的一些版本控制.这是表定义: class Table1(tag: Tag) extends Table[(Int,String,Int)](tag,"TABLE1") { def id = column[Int]("ID") def name = column[String]("NAME") def version = column
我的情况是,我必须首先选择,使用该值来发布创建.这是我试图实现的一些版本控制.这是表定义:
class Table1(tag: Tag) extends Table[(Int,String,Int)](tag,"TABLE1") { def id = column[Int]("ID") def name = column[String]("NAME") def version = column[Int]("VERSION") def indexCol = index("_a",(id,version)) val tbl1Elems = TableQuery[Table1] } 因此,当请求创建或更新Table1中的条目时,我必须执行以下操作: 1. Select for the given id,if exists,get the version 2. Increment the version 3. Create a new entry 所有这些都应该在一次交易中发生.这是我到目前为止所得到的: // this entry should be first checked if the id exists and if yes get //the complete set of columns by applying a filter that returns the max //version val table1 = Table1(2,"some name",1) for { tbl1: Table1 <- tbl1MaxVersionFilter(table1.id) maxVersion: Column[Int] = tbl1.version result <- tbl1Elems += table1.copy(version = maxVersion + 1) // can't use this!!! } yield result 我稍后会将整个块包装在一个事务中.但是我想知道如何完成它会创建一个新版本?如何从列中获取值maxVersion,以便我可以将1增加到它并使用它? 解决方法
我会使用静态查询,类似这样的东西
import scala.slick.jdbc.{StaticQuery=>Q} def insertWithVersion(id: Int,name:String) = ( Q.u + "insert into table1 select " +?id + "," +?name + ",( select coalese(max(version),1) from table1 where id=" +?id +")" ).execute 如果您想使用光滑的方式编写它,请查看以下内容 val tableOne = TableQuery[Table1] def updateWithVersion(newId:Int,name:String):Unit = { val version = tableOne.filter( _.id === newId).map( _.version).max.run.getOrElse(1) tableOne += (newId,name,version) } 想法是在同一查询中选择最大版本,如果没有版本,则使用1并插入它.此外,由于整个逻辑是在单个语句中发布的,因此不需要额外的事务管理. 附:可能有一些错误是sql和代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |