【问题标题】:How to group results with Slick如何使用 Slick 对结果进行分组
【发布时间】:2020-02-08 07:50:19
【问题描述】:

假设我有这两个模型:

case class Department(id: Long, title: String)
case class Program(id: Long, departmentId: Long, title: String)

还有两个TableQuerydepartmentsprograms,分别基于映射到这些案例类的Table

我想查询返回Seq[(Department, Seq[Program])],其中我有一个部门列表及其相应的程序。

我是这样开始的:

val query = 
  (departments join programs on ((d, p) => d.id === p.departmentId))
    .groupBy {...}

但是我在 group by 子句中的任何内容都没有意义。

请帮忙。

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    @osehyum,感谢您的回答。您的查询返回以下内容:

    Map[Long, Seq[(Department, Program)]]
    

    这里的 Long 是部门 ID。

    我设法用这个来转动它:

    val query = departments.joinLeft(programs).on(_.id === _.departmentId).result
        .map(_.groupBy(_._1).toSeq)
        .map(items => items.map { case (dep, rows) =>
          (dep, rows.map(_._2).filter(_.isDefined).map(_.get))
        })
    

    注意我这次使用了joinLeft,所以Program变成了Option[Program],所以我不得不filtermap。已经测试过了。

    【讨论】:

    • 我希望没有额外的性能影响,因为我按整行而不是 Id 分组。 Slick 应该使用 Id,然后按行而不是 Id 聚合。
    【解决方案2】:

    这个怎么样?

    val query = departments.join(programs).on(_.id === _.departmentId)
            .result
            .map(_.groupBy(_._1.id))
    
    db.run(query)
    

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2012-10-06
      相关资源
      最近更新 更多