代码之家  ›  专栏  ›  技术社区  ›  Christian P.

使用原始“base”比较Slick MappedColumnType

  •  1
  • Christian P.  · 技术社区  · 6 年前

    我有一个自定义的列类型, UniqueId 我用来绘制地图的 CHAR(36) 特定类型的UUID。由于代码的结构,每个ID都有一个特定的列类型( CustomerId , OrderId 等等,这也确保了我们不会在代码中比较苹果和桔子(尽管它们是相同的基础UUID)。

    但是,在某些情况下,我们有一个“通用的” targetId 在可以指向多个表中的ID的表中。因此, 目标ID 类型是简单的 String .

    用滑溜的,现在我们用 t1.targetId === t2.customerId.asColumnOf[String] 为了取悦编辑。问题是,它转换为 t1.targetId = CONCAT(t2.customerId) 它完全将性能(使用mysql)作为任何索引,这样就超出了窗口。

    我的问题是:有没有一种方法可以告诉Slick“只需按原样使用这个列,而不做任何事情”,这是一种“原始”比较,而不使用原始SQL查询?

    我们试过了 t2.customerId.asInstanceOf[String] 但在我们的情况下,它并不总是有效的(而且通常是不安全的)。

    1 回复  |  直到 6 年前
        1
  •  1
  •   C4stor    6 年前

    我有点挖掘,以下是我发现的工作:

    Rep.forNode[String](t2.customerId.toNode.:@(ScalaBaseType[String])) === t1.targetId
    

    它在SQL方面生成了一个简单的平等,以牺牲f**-D

    在我这边,我测试了一个列,我为它提供了一个 BaseColumnType[T] 我有点以为这也是你在做的。