【问题标题】:Slick - Update query with multiple tablesSlick - 使用多个表更新查询
【发布时间】:2019-07-18 09:11:19
【问题描述】:

我目前在我的 scala-slick3 项目中遇到更新查询的问题。我有一个Report-Class,其中包含多个Products,每个Product 包含多个Parts。我想实现一个函数,将这个Report 中的每个Product 中的每个Part 标记为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))
 }

现在,当我运行这段代码时,slick 会抛出这个异常: SlickException: A query for an UPDATE statement must resolve to a comprehension with a single table。 我已经研究过他们的解决方案(如thisthis)对我来说并不是很满意的类似问题。

为什么 slick 会抛出这个异常,或者为什么一开始就有问题?我的印象是我的yield 已经照顾到不“更新多个表”。

提前致谢!

【问题讨论】:

    标签: scala playframework slick slick-3.0


    【解决方案1】:

    我猜这是因为 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多