【问题标题】:scala slick - how to name yielded fields?scala slick - 如何命名产生的字段?
【发布时间】:2019-06-12 04:12:54
【问题描述】:

在 Slick 中我可以这样做:

  val joinQuery: Query[(Rep[String], Rep[String]), (String, String), Seq] = for {
    c <- coffees if c.price > 9.0
    s <- c.supplier
  } yield (c.name, s.name)

然后我可以像这样访问名称:

  joinQuery.map(_._1)

但我不方便使用 _1 访问该名称。

有什么方法可以命名产生的字段吗?

谢谢。

【问题讨论】:

  • 你的意思是 joinQuery.map{ case (coffeeName, supName) =&gt; //whatever } 之类的东西? (注意花括号!大括号)

标签: scala slick


【解决方案1】:

嗯...您可以为结果类型定义案例类,并使用它们来塑造查询结果。

case class YourQueryResult(coffeeName: String, supplierName: String)

val joinQuery = for {
  c <- coffees if c.price > 9.0
  s <- c.supplier
} yield (c.name, s.name)

val joinQueryResultFuture = database.run(joinQuery).map(seq => {
  seq.map({ case (coffeeName, supplierName) => YourQueryResult(coffeeName, supplierName) })
})

但是,假设您想进一步修改查询本身,您可以使用模式匹配,

val joinQuery = for {
  c <- coffees if c.price > 9.0
  s <- c.supplier
} yield (c.name, s.name)

val modificationQuery = joinQuery.map({
  case (coffeeName, supplierName) => coffeeName
})

【讨论】:

  • 可以用匿名类吗?
  • 我必须创建:case class CoffeeSupliersResult(name: Rep[String], name1: Rep[String]) 以便编译(使用 Rep[String])。但它会抛出异常“找不到匹配的形状”。
  • 当时我还在写答案。不知何故发布了不完整的答案。
【解决方案2】:

当时这可能还没有工作,但现在您可以使用 mapTo[] 执行以下操作 - 希望这对偶然发现这个问题的人有所帮助。

case class YourQueryResult(coffeeName: String, supplierName: String)

val joinQuery = for {
  c <- coffees if c.price > 9.0
  s <- c.supplier
} yield (c.name, s.name).mapTo[YourQueryResult]

然后访问为

joinQuery.map(_.coffeeName)

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 2018-02-12
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2014-02-25
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多