首页 > 解决方案 > 映射查询值后的Scala Slick过滤器

问题描述

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

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

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

希望这个问题有意义。

标签: scalaslick

解决方案


你可以这样做:

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] 否则您将进入隐式转换的无限循环。


推荐阅读