修改列值后将SLICK查询映射到默认投影 [英] Mapping Slick query to default projection after modifying column value

查看:0
本文介绍了修改列值后将SLICK查询映射到默认投影的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在创建表查询时,我希望通过映射默认表查询来修改我的SELECT语句。但是,我找不到一种方法来映射列的值,同时仍然映射到我的Case类

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 => ???)

我已尝试像映射Case类一样映射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返回的元组的返回结果映射到Case类,这样就不那么优雅了:

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列描述更好?

推荐答案

您不能乱弄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)
}) 

这篇关于修改列值后将SLICK查询映射到默认投影的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆