如何创建通用方法来更新 Slick 中的多列?
How to create generic method to update multiple columns in Slick?
我有这个通用方法来更新一列
def updateColumn[V](id: Int,
column: Table[UserRow] => Rep[V],
value: V)(implicit shape: Shape[_ <: FlatShapeLevel, Rep[V], V, _]) =
userTableQuery.filter(user => user.id === id).map(column).update(value))
所以,我可以这样使用它
updateColumn(1, user => user.firstName, "FirstName")
我想将它用于多列
updateColumn(1, user => (user.firstName, user.lastName), ("FirstName", "LastName"))
但是编译出错
No matching Shape found
Required level: slick.jdbc.PostgresProfile.api.FlatShapeLevel
Source type: slick.lifted.Rep[(String, String)]
是否可以创建这样的方法?
事实证明,这是可能的
def update[F, G, K](id: Int,
columns: Table[UserRow] => F,
value: K)(implicit shape: Shape[_ <: FlatShapeLevel, F, K, G]) =
userTableQuery.filter(user => user.id === id).map(columns).update(value)
我有这个通用方法来更新一列
def updateColumn[V](id: Int,
column: Table[UserRow] => Rep[V],
value: V)(implicit shape: Shape[_ <: FlatShapeLevel, Rep[V], V, _]) =
userTableQuery.filter(user => user.id === id).map(column).update(value))
所以,我可以这样使用它
updateColumn(1, user => user.firstName, "FirstName")
我想将它用于多列
updateColumn(1, user => (user.firstName, user.lastName), ("FirstName", "LastName"))
但是编译出错
No matching Shape found
Required level: slick.jdbc.PostgresProfile.api.FlatShapeLevel
Source type: slick.lifted.Rep[(String, String)]
是否可以创建这样的方法?
事实证明,这是可能的
def update[F, G, K](id: Int,
columns: Table[UserRow] => F,
value: K)(implicit shape: Shape[_ <: FlatShapeLevel, F, K, G]) =
userTableQuery.filter(user => user.id === id).map(columns).update(value)