光滑-使用多个表更新查询

时间:2019-07-18 09:11:19

标签: scala playframework slick slick-3.0

我目前在我的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。 我已经看过类似的问题,这些问题的解决方案(例如thisthis)对我来说并不令人满意。

为什么油滑会引发这种现象,或者为什么一开始会带来问题?我的印象是我的yield已经负责不“更新多个表”。

谢谢!

1 个答案:

答案 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))