光滑 - 更新完整对象或超过22列

Sun*_*mar 8 scala playframework-2.0 slick slick-2.0

我有一个表格user_permissions,其中包含46个权限列idcreated_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)

Pim*_*erk 1

针对问题2的一些建议:

  • 你能用Slick 3.0吗?这个版本好像有解决办法
  • 您能否以权限为行而不是列的方式更改数据库的布局?无论如何,这似乎更具可扩展性