我有一个自定义列类型UniqueId
,可用于将CHAR(36)
UUIDS映射到特定类型。由于我的代码结构如何,每个ID都有特定的列类型(CustomerId
,OrderId
)等,这也确保了我们在代码中不会将苹果与橘子进行比较(尽管相同的基础UUID。
但是,在某些情况下,表中有一个“通用” targetId
,它可以指向多个表中的ID。因此,targetId
类型就是String
。
使用Slick,目前我们t1.targetId === t2.customerId.asColumnOf[String]
是为了使编译器满意。问题在于,这会转换为t1.targetId = CONCAT(t2.customerId)
,从而完全破坏了使用任何索引的性能(使用MySQL),并且超出了这个范围。
我的问题:是否有一种方法可以告诉Slick“按原样使用此列,而不做任何事情”,有点像“原始”比较,而无需借助原始SQL查询?
我们尝试了t2.customerId.asInstanceOf[String]
,但它在我们的情况下并不总是有效(通常是不安全的)。
答案 0 :(得分:1)
我挖了一点,这是我发现正在工作的东西:
Rep.forNode[String](t2.customerId.toNode.:@(ScalaBaseType[String])) === t1.targetId
它在SQL端生成一个普通的相等性,但取舍为f *** ... :-D
在我这边,我用一栏进行了测试,为此我提供了BaseColumnType[T]
,我以为这也是您在做的事情。