我無法使用slick-3.1.1過濾定製類型。下面,自包含的例子,說明我的問題:如果我在我的定義,並在MappedColumnType
使用SomeType
,而不是SomeBaseType
在使用Slick映射列類型的過濾器中編譯錯誤
object IllustrateSlickQuestion {
val sqlDriver = slick.driver.PostgresDriver
import sqlDriver.api._
trait SomeBaseType {
def value: Int
}
object SomeBaseType {
def apply(value: Int): SomeBaseType = SomeType(value)
}
case class SomeType(value: Int) extends SomeBaseType
implicit val someBaseTypeMappedColumnType = MappedColumnType.base[SomeBaseType, Int](_.value, SomeBaseType.apply)
class SomeTable(tag: Tag) extends Table[(SomeBaseType, Option[SomeBaseType])](tag, "my_table") {
def someColumn = column[SomeBaseType]("some_column")
def someNullableColumn = column[Option[SomeBaseType]]("some_nullable_column")
def * = (someColumn, someNullableColumn)
}
val someTable = TableQuery[SomeTable]
// These selects work:
val compilingSelect1 = someTable.filter(_.someColumn inSet Set(SomeType(42)))
val compilingSelect2 = someTable.filter(_.someNullableColumn inSet Set(SomeType(42)))
// Does not compile:
// [error] type mismatch;
// [error] found : IllustrateSlickQuestion.SomeType
// [error] required: slick.lifted.Rep[?]
// [error] val brokenSelect1 = someTable.filter(_.someColumn === SomeType(42))
val brokenSelect1 = someTable.filter(_.someColumn === SomeType(42))
// Does not compile either:
// [error] see above
val brokenSelect2 = someTable.filter(_.someNullableColumn === SomeType(42))
}
這個問題消失。然而,這不是我真正關心的代碼中的一個選項,因爲SomeBaseType
代表枚舉。因此我堅持使用inSet
而不是===
作爲解決方法。
我做錯了什麼,或者這是Slick中的錯誤?
嗯,我從來沒有聽說過,案例類不應該實現特質;恰恰相反,這是常見的做法,像'Option'這樣的流行示例或List的實現顯示。另外,您提到的'override'關鍵字在我們正在討論的代碼中完全是可選的。最後但並非最不重要的一點,我所指的枚舉就像您的枚舉(通過https://github.com/lloydmeta/enumeratum#slick-integration增強)。至於回到Java枚舉:我已經有了一個解決方法,我寧願在這種情況下。 –
Mattias注意到我的示例代碼中的重寫val。無論如何,你以某種方式解決了這個問題,所以你應該發佈答案並在明天標記它,或者刪除問題 –
你指的對象是直接位於它上面的特徵的伴隨對象。這個特點是我擴展.... –