удаление значения не является членом slick.lifted.Query[T,T#TableElementType,Seq]

В настоящее время я играю с Play и play-slick. Следующий код дает мне ошибку

class GenericRepository(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
  import driver.api._

  implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
    d => Timestamp.from(d.toInstant(ZoneOffset.ofHours(0))),
    d => d.toLocalDateTime
  )

  protected trait GenericTable {
    this: Table[_] =>
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
    def createdAt = column[LocalDateTime]("created_at")
    def updatedAt = column[LocalDateTime]("updated_at")
  }

  protected class CrudRepository[T <: AbstractTable[_] with GenericRepository#GenericTable](private val tableQuery: TableQuery[T]) {
    def all = db.run(tableQuery.to[List].result)
    def create(obj: T#TableElementType) = db.run(tableQuery returning tableQuery.map(_.id) += obj)
    def delete(id: Long) = db.run(tableQuery.filter(_.id === id).delete)
  }
}

Ошибка:

value delete is not a member of slick.lifted.Query[T,T#TableElementType,Seq]

Я уже много гуглил, но ни одно решение не помогло мне. Например, я безуспешно пытался заменить «import driver.api.» на «import slick.driver.H2Driver.api.».

Я использую Scala 2.11.7 с play-slick 2.0.2 и Play 2.5.


person Magnus    schedule 06.12.2016    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: Из вашего вставленного кода я вижу теперь вашу проблему.

Просто измените свое определение на (я изменил только параметры типа):

protected class CrudRepository[E, T <: Table[E] with GenericRepository#GenericTable](private val tableQuery: TableQuery[T]) {
    def all = db.run(tableQuery.to[List].result)
    def create(obj: T#TableElementType) = db.run(tableQuery returning tableQuery.map(_.id) += obj)
    def delete(id: Long) = db.run(tableQuery.filter(_.id === id).delete)
  }

где Table равно slick.relational.RelationalProfile.API.Table.

Затем создайте экземпляр CrudRepository следующим образом:

val crud = new CrudRepository[Redirect,RedirectsTable](Redirects)

Кроме того, что это выглядит хорошо.

person Paul Dolega    schedule 06.12.2016
comment
Также вы можете подумать, имеет ли смысл возвращать Future из метода CrudRepository. Такой подход не позволит вам выполнять операции внутри транзакции. - person Paul Dolega; 06.12.2016
comment
Эй, спасибо за ваш ответ! К сожалению, это приводит к другой ошибке: pastebin.com/k2KDemM8 Очевидно, Scala не видит, что драйвер импортирует для обоих классов одинаковы. Кстати, для меня db.run всегда возвращает Future. - person Magnus; 06.12.2016
comment
Взгляните на мой обновленный ответ - он компилирует ваш код. - person Paul Dolega; 12.12.2016
comment
Какая это версия Слика? У меня нет slick.relational.RelationalProfile.API.Table в Slick 3.1.0 (но такая же проблема). - person JulienD; 22.12.2016
comment
Нашел: ‹slick.driver.MySQLDriver›.profile.api.Table - person JulienD; 22.12.2016