У меня есть таблица 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>
)
Теперь я хочу обновить набор UserPermission, который идентифицируется как id
. Функция, которую я имею:
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'.]]
что имеет смысл, поскольку SQL, сгенерированный Slick, выглядит следующим образом:
update "users_permissions" set "id" = ?, "created_date" = ?, ...
Проблема 1 Итак, моя первая проблема заключается в том, что я не могу обновить полный объект UserPermission
с помощью slick. Если бы у меня было решение этой проблемы, было бы здорово.
Поскольку я не могу обновить весь объект, я решил 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 не обновляет 46 столбцов в query.update()
функции. Он может обрабатывать только 22 столбца одновременно. Как я могу обновить свой объект UserPermissions
?
Одно плохое решение, которое я могу придумать, - обновить 22 в первый раз, затем 22 во второй, затем 2 в третьем запросе. Это будет 3 запроса на обновление БД, которые мне не нужны.
Есть решения моей проблемы?
Зависимости:
scalaVersion := "2.11.4"
"com.typesafe.play" %% "play-slick" % "0.8.1"
"com.typesafe.slick" %% "slick-extensions" % "2.1.0"