scala - 光滑的 groupBy 中的任何字符串连接方法?

标签 scala playframework slick

我正在尝试在 Slick 查询中应用 .groupBy

var q = (for {
      user <- Users
      userSettings <- UserSettings if user.id === userSettings.userId
    } yield (user, userSettings)).groupBy {
      case (users, userSettings) =>
        (user.id, userSettings.controls)
    }.map {
      case (x, y) => (x._1, y.map(_._2.controls).???)
    }

如果 controls 列是 Integer 或 Long,我可以应用 sumavg 和其他聚合函数。但在这种情况下,controls 是一个字符串。如何分组连接这些字符串,使记录看起来像

-----------------------------------------
|User ID    |User Controls              |
-----------------------------------------
|1          |left, right, up, down      |
|2          |left, right                |
-----------------------------------------

不应用 groupBy 记录看起来像这样

-----------------------------------------
|User ID    |User Controls              |
-----------------------------------------
|1          |left                       |
|1          |right                      |
|1          |up                         |
|1          |down                       |
|2          |left                       |
|2          |right                      |
-----------------------------------------

最佳答案

Slick 获取您的 Scala 代码并将其转换为 SQL,因此您在 Slick 中执行的任何操作都必须得到底层 SQL 的支持。如果您搜索与在 SQL 中连接字符串相关的类似问题,您 find some results on SO .不幸的是,在 SQL 中做这种事情并非易事。 (注意:在某些 SQL 方言中是可能的。)可能有一些 Slick 驱动程序公开了 SQL 方言特定的功能,或者在 SQL 查询之后执行的东西,但您可以简单地进行查询,并在对数据库执行后运行 groupBy/map,例如:

val q = for {
  user <- Users
  userSettings <- UserSettings if user.id === userSettings.userId
} yield (user.id, userSettings.controls)
val db = Database.forConfig("h2mem1")
try {
  for {
    res <- db.run(q.result)
  } yield res
    .groupBy(_._1)
    .map({ case (id, t) => id -> t.map(_._2).mkString(", ") })
} finally db.close

关于scala - 光滑的 groupBy 中的任何字符串连接方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40175965/

相关文章:

java - 使用共享数据库和模型更新在 Heroku 上运行应用程序

scala - 在 for 表达式中对 Slick 查询结果进行排序

scala - Vaadin 8 - 包含字符串内容的文本文件的下载按钮

scala - 我如何将Either 推广到更多(和递归)类型?

Scala <控制台> :24: error: could not find implicit value for evidence parameter of type breeze. storage.DefaultArrayValue[任意]

json - 在 Json.toJson() 之后 Play ebean 的 Date 字段格式

java - Play Framework 1.2.x 中的 ManyToMany 测试装置 (Yaml)

list - 如何在Scala中通过相同元素合并元组

scala - 对 Slick 使用单独的 ExecutionContext

scala - 使用环境变量将 sbt scala 项目发布到 Artifactory