使用原始“ base”比较Slick MappedColumnType

时间:2018-07-12 08:55:29

标签: scala slick

我有一个自定义列类型UniqueId,可用于将CHAR(36) UUIDS映射到特定类型。由于我的代码结构如何,每个ID都有特定的列类型(CustomerIdOrderId)等,这也确保了我们在代码中不会将苹果与橘子进行比较(尽管相同的基础UUID。

但是,在某些情况下,表中有一个“通用” targetId,它可以指向多个表中的ID。因此,targetId类型就是String

使用Slick,目前我们t1.targetId === t2.customerId.asColumnOf[String]是为了使编译器满意。问题在于,这会转换为t1.targetId = CONCAT(t2.customerId),从而完全破坏了使用任何索引的性能(使用MySQL),并且超出了这个范围。

我的问题:是否有一种方法可以告诉Slick“按原样使用此列,而不做任何事情”,有点像“原始”比较,而无需借助原始SQL查询?

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

1 个答案:

答案 0 :(得分:1)

我挖了一点,这是我发现正在工作的东西:

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

它在SQL端生成一个普通的相等性,但取舍为f *** ... :-D

在我这边,我用一栏进行了测试,为此我提供了BaseColumnType[T],我以为这也是您在做的事情。