映射 Slick SQL 查询结果到案例 类
Mapping Slick SQL Query results to case classes
我有一个复杂的 sql 查询,由多个 joins/left 连接组成,结果类型如下所示:
val query = sql"""
// body of query
""".as[(Long, String, String, Int, Long, Long, String, Int, Option[Int], Option[Int], Option[String], Option[Timestamp], Option[Timestamp])]
运行 此查询的结果是具有 10 多个属性的元组列表。
处理列表以生成案例 类:
db.run(query).map(_.groupBy { case (p1, p2, p3, p4, _, _, _, _, _, _, _, _, _) =>
(p1, p2, p3, p4)
}.map { case ((o1, co2, o3, o4), o5) =>
CaseClass1(o1, co2, o3, Seq(o4), o5.groupBy {
case (_, _, _, _, u1, _, _, _, _, _, _, _, _) => u1
}.map { case (t1, t2) =>
CaseClass2(t1, t2.flatMap {
case (_, _, _, _, _, _, _, _, Some(n1), Some(n2), Some(n3), Some(n4), Some(n5)) => Some(CaseClass3(n1, n2, n3, n4, n5))
case _ => None
}, t2.map {
case (_, _, _, _, _, m1, m2, m3, _, _, _, _, _) => CaseClass4(m1, m2, m3, l1)
})
}.toSeq)
}
将结果集映射到案例 类 的过程本身不是很可扩展,每次我添加要从查询中选择的新 属性 时都让我很头疼。有没有更简单的方法将结果集映射到 case 类?
是的,肯定有。
首先创建一个案例class来替换你的元组,我们称它为MyMatch
。
case class MyMatch( p1: Long, p2: String ...)
然后,创建一个 GetResult
并使用此 class
检索结果
implicit val getMyMatch = GetResult(r => MyMatch(r.<<, r.<<, r.<<, ...)
val query = sql"""
// body of query
""".as[MyMatch]
然后您可以将 groupBy 与新的 case class 属性一起使用。
db.run(query).map(_.groupBy { x => (x.p1, x.p2, x.p3, x.p4) }
平面图可以变成
flatMap { x => for { n1 <- x.n1; n2 <- x.n2 ...} yield CaseClass3(n1, n2, ...) }
我有一个复杂的 sql 查询,由多个 joins/left 连接组成,结果类型如下所示:
val query = sql"""
// body of query
""".as[(Long, String, String, Int, Long, Long, String, Int, Option[Int], Option[Int], Option[String], Option[Timestamp], Option[Timestamp])]
运行 此查询的结果是具有 10 多个属性的元组列表。 处理列表以生成案例 类:
db.run(query).map(_.groupBy { case (p1, p2, p3, p4, _, _, _, _, _, _, _, _, _) =>
(p1, p2, p3, p4)
}.map { case ((o1, co2, o3, o4), o5) =>
CaseClass1(o1, co2, o3, Seq(o4), o5.groupBy {
case (_, _, _, _, u1, _, _, _, _, _, _, _, _) => u1
}.map { case (t1, t2) =>
CaseClass2(t1, t2.flatMap {
case (_, _, _, _, _, _, _, _, Some(n1), Some(n2), Some(n3), Some(n4), Some(n5)) => Some(CaseClass3(n1, n2, n3, n4, n5))
case _ => None
}, t2.map {
case (_, _, _, _, _, m1, m2, m3, _, _, _, _, _) => CaseClass4(m1, m2, m3, l1)
})
}.toSeq)
}
将结果集映射到案例 类 的过程本身不是很可扩展,每次我添加要从查询中选择的新 属性 时都让我很头疼。有没有更简单的方法将结果集映射到 case 类?
是的,肯定有。
首先创建一个案例class来替换你的元组,我们称它为MyMatch
。
case class MyMatch( p1: Long, p2: String ...)
然后,创建一个 GetResult
并使用此 class
implicit val getMyMatch = GetResult(r => MyMatch(r.<<, r.<<, r.<<, ...)
val query = sql"""
// body of query
""".as[MyMatch]
然后您可以将 groupBy 与新的 case class 属性一起使用。
db.run(query).map(_.groupBy { x => (x.p1, x.p2, x.p3, x.p4) }
平面图可以变成
flatMap { x => for { n1 <- x.n1; n2 <- x.n2 ...} yield CaseClass3(n1, n2, ...) }