Фильтрация по опции пользовательского столбца в Slick 3.0.2 - PullRequest
0 голосов
/ 11 мая 2018

У меня возникли некоторые проблемы с получением следующего примера для компиляции.

import scala.slick.driver.MySQLDriver.simple._

case class Age(value: Int)
case class User(id: Long, age: Option[Age])

object Dao {
  implicit val ageColumnType: TypedType[Age] = MappedColumnType.base[Age, Int](_.value, Age(_))

  class UserTable(tag: Tag) extends Table[User](tag, "users") {
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
    def age = column[Option[Age]]("age")
    def * = (id, age) <> (User.tupled, User.unapply)
  }

  val users = TableQuery[UserTable]
  def byId(id: Long)(implicit session: Session): Option[User] = {
    users.filter(_.age === Some(Age(21))).firstOption
  }
}

Но компилятор не работает со следующей ошибкой:

Example.scala:16:28: value === is not a member of slick.lifted.Rep[Option[Age]]

Правильный ли способ сделать этоиспользовать OptionColumnExtensionMethods или что-то еще?Странно, однако, что классы типов для TypedType[Option[T]] здесь не сработают.


Вот список некоторых других ресурсов, которые я выкопал, но ни один из них, похоже, не имеет отношения кТип контейнера вокруг пользовательского типа столбца, используя mappedColumnType.

1 Ответ

0 голосов
/ 16 мая 2018

Понял и понял, что это стоит опубликовать здесь.


В следующей строке слишком широкая сигнатура типа.

implicit val ageColumnType: TypedType[Age]

Очевидно, что неявная область видимости больше не нужнасодержал правильные доказательства для вывода различных операторов столбцов, необходимых в запросе filter, включая метод ===.Вместо этого мне просто нужен был более конкретный тип:

implicit val ageColumnType: BaseColumnType[Age]

Согласно комментарию к исходному вопросу, решение ==? также работает после внесения этого изменения.Спасибо!

...