【问题标题】:Scala Slick filter after mapping query value映射查询值后的Scala Slick过滤器
【发布时间】:2018-06-01 00:46:51
【问题描述】:

在按 ID 进行 Slick 查询之前,有没有办法转换 id(从外部哈希到数据库主键 id)。对于其他巧妙的查询,我可以覆盖案例类应用/取消应用以在外部和内部 ID 之间进行映射。但是,当使用 filter() 按 ID 查询时,我不知道在调用 filter 之前没有映射的任何方式。

val res = items.filter(i => i.id === itemId)

这里的 itemId 是外部可见的 ID,而不是存储在数据库中的 id 值。想知道是否可以扩展 TableQuery 并在调用过滤器之前更改 id 值。

希望这个问题有意义。

【问题讨论】:

  • 您可以在此处应用您想要的任何转换函数:val res = items.filter(i => i.id === transform(itemId)) 其中transform 是所需的转换函数?我不确定我明白你的意思
  • 专门寻找透明地执行此操作,这样我们就不必记住对每个查询都使用转换
  • 我能看到的最好方法是:1. 使 ItemId 成为特定类型 2. 提供从该类型到 Rep[Int] 的隐式转换,并进行正确的转换
  • @C4stor 你有任何示例代码来说明这一点吗?谢谢!

标签: scala slick


【解决方案1】:

你可以这样做:

type ItemId = String

  implicit def ItemIdToRepInt(itemId: ItemId): Rep[Int] = {
    itemId.toInt*2 // We let the implicit conversion provided by slick from Int to Rep[Int] occur here
  }

  val itemId: ItemId = "1"

  db.run(MyTable.filter(i => i.id === itemId).result) //will filter on id = 2

希望这对你有意义:-)

另外,如果 ItemId 实际上是 Int,则需要更准确地从 Item 转换为 Rep[Int] 否则会陷入隐式转换的无限循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2018-03-26
    • 2016-05-21
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多