我想做这样的事情
UPDATE item
SET value = (
SELECT max(value)
FROM item
)
WHERE id = 1;
我试过了
for {
maxValue <- Tables.Item.map(_.value).max
x <- Tables.Item
.filter(item => item.id === 1)
.map(_.value).update(maxValue)
} yield x
不过 maxValue
是一个 Rep[Int]
而不是 Int
斯利克的 update
不支持动态值或子查询。. 对于这种情况,你有几个选择。
首先,你可以使用Plain SQL。
sqlu""" UPDATE item SET value = (SELECT max(value) FROM item) WHERE id = 1 """
第二,你可以将表达式作为两个查询来运行(可能在一个事务中)。这与你的例子类似,如 update
是一个 DBIO
而不是 Query
.
我希望 max
有一个可选的值,因为表中可能没有记录。
val updateAction: DBIO[Int] =
Tables.Item.map(_.value).max.result.flatMap {
case Some(maxValue) =>
Tables.Item
.filter(item => item.id === 1)
.map(_.value).update(maxValue)
case None =>
DBIO.successful(0) // ... or whatever behaviour you want
}
但是,也许你的 value
字段已经是一个选项,你可以使用你现有的理解与添加的 .result
头上 maxValue
如@Duelist所提到的表达方式。