scala 创建Map的Doobie查询

mm9b1k5b  于 2022-12-04  发布在  Scala
关注(0)|答案(2)|浏览(171)

假设我有一个sql,它将返回一个如下所示的结果集:
| 识别码|数值|
| - -|- -|
| A1级|值1|
| A1级|数值2|
| A1级|值3|
| 地下一层|值4|
| 地下一层|值5|
| 地下一层|值6|

val query = sql"""select blah""".query[(ID, VALUE)]
val result: ConnectionIO[(ID, List[VALUE])] = for {
  tuples <- query.to[List]
} yield tuples.traverse(t => t._1 -> t._2)

这是我所能得到的最接近的结果,但我得到了一个编译器错误:

Could not find an instance of Applicative for [+T2](ID, T2)

我想要的是将其转换为Map[ID,List[VALUE]]

332nm8kg

332nm8kg1#

在这里,.traverse不是最有用的方法,请尝试以下方法:

val result: ConnectionIO[Map[ID, List[VALUE]]] = for {
  tuples <- query.to[List]
} yield tuples.groupMap(_._1)(_._2)

如果您的Scala版本低于2.13,您可以尝试:

val result: ConnectionIO[Map[ID, List[VALUE]]] = for {
  tuples <- query.to[List]
} yield tuples
   .groupBy(_._1) // Map[ID, List[(ID, VALUE])]
   .mapValues(_.map(_._2))
0wi1tuuw

0wi1tuuw2#

我不知道你用的是什么数据库,但是如果你有像postgresql这样的数组函数,你可以试着用array_agggroup by。之后你可以在List[(ID, List[VALUE])]上运行.asMap.groupBy

val query = 
  sql"""select id, array_agg(value) as values group by id"""
    .query[(ID, List[VALUE])]
val result = query.to[List].map(_.toMap)

相关问题