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)