【问题标题】:Mapping Slick query to default projection after modifying column value修改列值后将 Slick 查询映射到默认投影
【发布时间】:2016-02-07 12:23:58
【问题描述】:

创建表查询时,我想通过映射默认表查询来修改我的选择语句。但是,我找不到一种方法来映射列的值并仍然映射到我的案例类

case class MyRecord(id: Int, name: String, value: Int)

class MyTable(tag: Tag) extends Table[MyRecord](tag, "MYTABLE") {
    def id = column[Int]("id")
    def name = column[String]("name")
    def value = column[Int]("value")

    def * = (id, name, value) <> (MyRecord.tupled, MyRecord.unapply)
  }

lazy val tableQuery = TableQuery[MyTable]

我想用this function 修剪name 的值:

def trimLeading0: (Rep[String]) => Rep[String] = SimpleExpression.unary[String, String] {
    (str, queryBuilder) =>
      import slick.util.MacroSupport._
      import queryBuilder._
      b"TRIM(LEADING 0 FROM $str)"
  }

现在我不知道该怎么做:

val trimmedTableQuery: Query[MyTable, MyRecord, Seq] = tableQuery.map(s => ???)

我已经尝试映射Rep,就像我对案例类所做的那样:

val trimmedTableQuery = tableQuery.map(s => s.copy(name = trimLeading0(s.name)))

这拒绝用value copy is not a member of MyTable编译

我目前的解决方法是使用自定义函数而不是 MyRecord.tupled 进行默认投影:

def trimming(t: (Int, String, Int)) = MyRecord(t._1, t._2.dropWhile(_ == "0"), t._3)
def * = (id, name, value) <> (trimming, MyRecord.unapply)

或者,我可以将返回元组的DBIOAction 的返回结果映射到案例类,这样就不太优雅了:

val action = tableQuery.map{ s => (s.id, trimLeading0(s.name), s.value)}.result
val futureTuples: Future[Seq[(Int, String, Int)]] = db.run(action)
val records = futureTuples map (s => s.map(MyRecord.tupled))

但是在构建查询时如何在 map 方法中执行此操作?或者更改def name 列描述会更好吗?

【问题讨论】:

    标签: sql scala slick slick-3.0


    【解决方案1】:

    你不能弄乱 MyTable 中的默认投影(即 def *),因为它需要是对称的。它用于查询和插入。但是您可以基于 MyTable 的特化创建一个 trimmedTableQuery 并覆盖默认投影。然后,您还可以拥有基于对称默认投影的 tableQuery。如果您尝试基于 trimmedTableQuery 进行插入,则会收到错误消息(但您不需要这样做,只需使用 tableQuery 进行插入即可)。

    lazy val tableQuery = TableQuery[MyTable]
    lazy val trimmedTableQuery = new TableQuery(new MyTable(_) {
      override def * = (id, trimLeading0(name), value) <> (MyRecord.tupled, MyRecord.unapply)
    }) 
    

    【讨论】:

    • 另一个很好的答案。我在这里学到了两件事:) 非常感谢,Sue C
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多