【发布时间】:2015-09-28 00:27:19
【问题描述】:
我有一个表 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)
和光滑的映射表
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>
)
现在我想更新由id 标识的UserPermission 集。我的功能是:
object UserPermissions {
val userPermissions = TableQuery[UserPermissions]
def update(userPermission: UserPermission)(implicit session: Session) = {
userPermissions.filter(_.id === userPermission.id.get).update(userPermission)
}
}
这不起作用并抛出异常:
play.api.Application$$anon$1: Execution exception[[SQLServerException: Cannot update identity column 'id'.]]
这是有道理的,因为 Slick 生成的 SQL 是:
update "users_permissions" set "id" = ?, "created_date" = ?, ...
问题 1
所以我的第一个问题是 我无法使用 slick 更新完整的 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)
}
问题 2 现在 slick 不会更新 query.update() 函数中的 46 列。它一次只能处理 22 列。如何更新我的 UserPermissions 对象?
我能想到的一个不好的解决方案是第一次更新 22,然后更新 22 第二,然后在第三次查询中更新 2。这将是 3 个我不想要的 db 更新查询。
我的问题有什么解决方案吗?
依赖项是:
scalaVersion := "2.11.4"
"com.typesafe.play" %% "play-slick" % "0.8.1"
"com.typesafe.slick" %% "slick-extensions" % "2.1.0"
【问题讨论】:
标签: scala playframework-2.0 slick slick-2.0