【发布时间】:2016-05-24 07:44:07
【问题描述】:
我在使用 slick-3.1.1 过滤自定义类型时遇到问题。以下自包含的示例说明了我的问题:
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))
}
如果我在定义和MappedColumnType 中使用SomeType 而不是SomeBaseType,这个问题就会消失。然而,这不是我真正关心的代码中的一个选项,因为SomeBaseType 代表一个枚举。因此,我坚持使用 inSet 而不是 === 作为解决方法。
我做错了什么,或者这是 Slick 中的错误?
【问题讨论】: