Sun*_*mar 8 scala playframework-2.0 slick slick-2.0
我有一个表格user_permissions,其中包含46个权限列id和created_date.该表有一个对应的UserPermissions类:
class UserPermission(val id: Long,
val createdDate: Option[Timestamp],
val permission1: Boolean,
val permission2: Boolean,
...
val permission46: Boolean)
Run Code Online (Sandbox Code Playgroud)
和光滑的映射表
class UserPermissions(tag: Tag) extends Table[UserPermission](tag, "users_permissions") {
def * = (
id ::
createdDate ::
permission1 ::
permission2 ::
...
permission46 ::
HNil).shaped <> (
{ case x => UserPermission(
x(0), x(1), x(2), ... x(47))
},
{
UserPermission.unapply _
}
}
... <columns defined here>
)
Run Code Online (Sandbox Code Playgroud)
现在我想更新标识的UserPermission集id.我的功能是:
object UserPermissions {
val userPermissions = TableQuery[UserPermissions]
def update(userPermission: UserPermission)(implicit session: Session) = {
userPermissions.filter(_.id === userPermission.id.get).update(userPermission)
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用并抛出异常:
play.api.Application$$anon$1: Execution exception[[SQLServerException: Cannot update identity column 'id'.]]
Run Code Online (Sandbox Code Playgroud)
这有点意义,因为Slick生成的SQL是:
update "users_permissions" set "id" = ?, "created_date" = ?, ...
Run Code Online (Sandbox Code Playgroud)
问题1
所以我的第一个问题是我无法UserPermission用光滑更新完整的对象.如果我能解决这个问题,那就太好了.
由于我无法更新完整对象,因此我想到yield了要更新的列,然后触发更新查询.代码如下所示:
def update(obj: UserPermission)(implicit session: Session) = {
val query = for {
p <- userPermissions
if p.id === obj.id.get
} yield (p.permission1, p.permission2, ... p.permission46)
query.update(obj.permission1, obj.permission2, ... obj.permission46)
}
Run Code Online (Sandbox Code Playgroud)
问题2现在光滑没有更新query.update()功能中的46列.它一次只能处理22列.我该如何更新我的UserPermissions对象?
我能想到的一个糟糕的解决方案是第一次更新22次,然后是22秒,然后是第三次查询中的2次.这将是我不想要的3 db更新查询.
我问题的任何解决方案?
依赖关系是:
scalaVersion := "2.11.4"
Run Code Online (Sandbox Code Playgroud)
"com.typesafe.play" %% "play-slick" % "0.8.1"
"com.typesafe.slick" %% "slick-extensions" % "2.1.0"
Run Code Online (Sandbox Code Playgroud)