Scala 如何将Slick结果转换为所需格式?

Scala 如何将Slick结果转换为所需格式?,scala,akka,h2,akka-http,slick-3.0,Scala,Akka,H2,Akka Http,Slick 3.0,我有类型为Person的域对象,它在case类中定义如下: case class Person(personName: String, personAge: Int, personId: Long = 0) case class Address(houseNumber: Int, street: String , state: String, ownerId: Long, id: Long = 0) 对应的查询表如下: final case class PersonTable(tag: Ta

我有类型为
Person
的域对象,它在case类中定义如下:

case class Person(personName: String, personAge: Int, personId: Long = 0)
case class Address(houseNumber: Int, street: String
, state: String, ownerId: Long, id: Long = 0)
对应的查询表如下:

final case class PersonTable(tag: Tag) extends Table[Person](tag, "people") {

  def personId = column[Long]("person_id", O.AutoInc, O.PrimaryKey)

  def personName = column[String]("person_name")

  def age = column[Int]("person_age")

  def * = (personName, age, personId).mapTo[Person]
}
我有类型为
Address
的域对象,它在case类中定义如下:

case class Person(personName: String, personAge: Int, personId: Long = 0)
case class Address(houseNumber: Int, street: String
, state: String, ownerId: Long, id: Long = 0)
其对应的表类定义如下。人员和地址具有一对多关系(一个人可以有多个地址,但一个地址只属于一个人

我想从基于
Akka http
的REST API返回以下类型的JSON结果(地址应作为数组返回):

为了得到这个结果,我使用Slick编写了查询,如下所示:

  val peopleQueries = TableQuery[PersonTable]
  val addressQueries = TableQuery[AddressTable]
  val query = peopleQueries.filter(_.personName === "Shekhar") joinLeft addressQueries on (_.personId === _.ownerId)
  val futureResultData = db.run(query.result)
我在以下结构中得到了这个结果(每个地址的人员详细信息都会重复):

要将上述内容转换为预期的JSON格式,我可以等到DB query运行后再编写一些Scala代码,以获得所需的格式,但这将阻止请求,直到此后处理完成(如果我有错误,请纠正我)

我的代码如下所示:

futureResultData.onComplete {
  case Success(data) => // code to bring data in desired format
}
我想知道是否有办法以异步/非阻塞方式获得结果


多亏了,我才找到了解决这个问题的办法

对我有效的解决方案如下:

futureResultData.map( x => {
        x.groupBy(_._1).mapValues(_.map(_._2.get))
})
如果你发布转换的实际代码,我可以为你提供更多帮助

未来是单子,所以当你映射时,你处理的是未来,如果你有一个未来[Int],你映射这个未来,在映射中你处理的是Int

例如:

val aFuture = Future.successful(1)
aFuture.map(f=>  f+ 1)

你可以规划未来并与之合作that@PedroCorreiaLu你能给我一些关于如何做的提示吗?我读了这篇关于“映射未来”的文章,但我不能清楚地理解它。你可以把未来看作是一种奇怪的集合,它只包含一个元素。所有的一切都是通过
未来的魔法来完成的
类。因此,
map
flatMap
的工作原理与它们在
Seq
上的工作原理一样。感谢您的回答。它帮助我更好地理解事物。我编写了以下代码以获得所需的结果,但我不确定它是否会阻止线程,或者它是否会在将来的futureResultData.groupBy(._1).mapValues(.map(._2.get))中执行,与您共享实际代码的最佳方式是什么?GitHub?@Shekhar是GitHub
futureResultData.map {
  _.transformInDesiredFormat // code to bring data in desired format
}
val aFuture = Future.successful(1)
aFuture.map(f=>  f+ 1)