如何使用 Slick 对结果进行分组
How to group results with Slick
假设我有这两个模型:
case class Department(id: Long, title: String)
case class Program(id: Long, departmentId: Long, title: String)
和两个 TableQuery
、departments
和 programs
,基于 Table
分别映射到那些案例 类。
我想查询返回一个 Seq[(Department, Seq[Program])]
,其中我有一个部门列表及其相应的程序。
我是这样开始的:
val query =
(departments join programs on ((d, p) => d.id === p.departmentId))
.groupBy {...}
但是我放在 group by 子句中的任何内容都没有意义。
请帮忙。
这个怎么样?
val query = departments.join(programs).on(_.id === _.departmentId)
.result
.map(_.groupBy(_._1.id))
db.run(query)
@osehyum,感谢您的回答。您的查询返回此:
Map[Long, Seq[(Department, Program)]]
这里的Long
是部门编号
我用这个成功地改变了它:
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]
,只好filter
和map
。已测试。
假设我有这两个模型:
case class Department(id: Long, title: String)
case class Program(id: Long, departmentId: Long, title: String)
和两个 TableQuery
、departments
和 programs
,基于 Table
分别映射到那些案例 类。
我想查询返回一个 Seq[(Department, Seq[Program])]
,其中我有一个部门列表及其相应的程序。
我是这样开始的:
val query =
(departments join programs on ((d, p) => d.id === p.departmentId))
.groupBy {...}
但是我放在 group by 子句中的任何内容都没有意义。
请帮忙。
这个怎么样?
val query = departments.join(programs).on(_.id === _.departmentId)
.result
.map(_.groupBy(_._1.id))
db.run(query)
@osehyum,感谢您的回答。您的查询返回此:
Map[Long, Seq[(Department, Program)]]
这里的Long
是部门编号
我用这个成功地改变了它:
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]
,只好filter
和map
。已测试。