我目前在我的scala-slick3项目中遇到了更新查询问题。我有一个Report
类,其中包含多个Products
,每个Product
包含多个Parts
。我想实现一个函数,将此Part
中每个Product
的每个Report
标记为assessed
。
我考虑过要做这样的事情:
def markProductPartsForReportAsAssessed(reportId: Int) = {
val query = for {
(products, parts) <- (report_product_query filter(_.reportId === reportId)
join (part_query filter(_.isAssessed === false))
on (_.productId === _.productId))
} yield parts.isAssessed
db.run(query.update(true))
}
现在,当我运行此代码时,代码会抛出此异常:
SlickException: A query for an UPDATE statement must resolve to a comprehension with a single table
。
我已经看过类似的问题,这些问题的解决方案(例如this或this)对我来说并不令人满意。
为什么油滑会引发这种现象,或者为什么一开始会带来问题?我的印象是我的yield
已经负责不“更新多个表”。
谢谢!
答案 0 :(得分:0)
我猜这是因为UPDATE查询只需要一个表。如果您为上述查询编写SQL,则可以是
UPDATE parts a SET isAccessed = 'true'
WHERE a.isAccessed = 'false' and
exists(select 'x' from products b
where a.productId = b.producId and b.reportId = reportId)
因此,您可以将与“产品”表相关的条件放在过滤器中,如下所示。
val reportId = "123" // some variable
val subQuery = (reportId:Rep[String], productId:Rep[String]) =>
report_product_query.filter(r => r.report_id === reportId && r.product_id === productId)
val query = part_query.filter(p => p.isAccesssed === false:Rep[Boolean] &&
subQuery(reportId, p.productId).exists).map(_.isAccessed)
db.run(query.update(true))