Scala slick groupBy中有字符串连接方法吗?

Scala slick groupBy中有字符串连接方法吗?,scala,playframework,slick,Scala,Playframework,Slick,我试图在一个巧妙的查询中应用.groupBy var q = (for { user <- Users userSettings <- UserSettings if user.id === userSettings.userId } yield (user, userSettings)).groupBy { case (users, userSettings) => (user.id, userSettings.co

我试图在一个巧妙的查询中应用
.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).???)
    }
如果不应用
groupBy
记录,则如下所示

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

Slick获取您的Scala代码并将其转换为SQL,因此您在Slick中所做的任何事情都必须得到底层SQL的支持。如果您在SQL中搜索与串接字符串相关的类似问题,则您可以。不幸的是,在SQL中执行此类操作是非常重要的。(注意:在某些SQL方言中是可能的。)可能有一些精巧的驱动程序公开特定于SQL方言的函数,或者在SQL查询之后执行某些操作,但您可以简单地执行查询,并在对DB执行后运行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
val q=for{

用户不幸的是,没有注意到对此的支持。在这种情况下,我们可以使用带有适当验证和清理的原始查询

假设我有一个名为
logs
(id,message,date)的表。我想按日期分组并联系每个分组消息。因此我的查询将是:

def histogram(data: ReqData): Future[Vector[DbHistogramMapper]] = {

    var messageWild = s"%${data.phrase}%"
    /**Need to write raw query because there is no support for GROUP_CONCAT in slick*/
    val query = sql"""SELECT "date" AS date, GROUP_CONCAT("message") AS message FROM "logs" WHERE "date" >= ${data.datetimeFrom} AND "date" <= ${data.datetimeUntil} AND "message" LIKE  ${messageWild} GROUP BY "date" """.as[DbHistogramMapper]
    db.run(query)
  }

我想在运行
db.run
IIRC之前应用搜索排序-如果行从
db.run
返回时已排序,Scala的groupBy()应保持分组内的顺序。讨论对后端特定聚合函数的支持时存在一个问题:如果您碰巧使用postgres,则slick有一个扩展,它增加了对这些函数的支持:
def histogram(data: ReqData): Future[Vector[DbHistogramMapper]] = {

    var messageWild = s"%${data.phrase}%"
    /**Need to write raw query because there is no support for GROUP_CONCAT in slick*/
    val query = sql"""SELECT "date" AS date, GROUP_CONCAT("message") AS message FROM "logs" WHERE "date" >= ${data.datetimeFrom} AND "date" <= ${data.datetimeUntil} AND "message" LIKE  ${messageWild} GROUP BY "date" """.as[DbHistogramMapper]
    db.run(query)
  }
case class DbHistogramMapper(
     date: Timestamp,
     message: String
)