2016-11-28 5 views
1

Я пытаюсь создать Slick 3.1.1 Generic DAO для моей модной модели с кодом. Тем не менее, я столкнулся с одной последней ошибкой компиляции, которая не может найти, как исправить.Slick 3.1.x Generic DAO для ошибки JdbcProfile «значение id не является членом ...»

Весь проект доступен в GitHub play-authenticate-usage-scala, а соответствующий исходный код находится в GenericDao.scala.

Ошибка компилятора заключается в следующем:

[info] Compiling 16 Scala sources and 1 Java source to /home/bravegag/code/play-authenticate-usage-scala/target/scala-2.11/classes... 
[error] /home/bravegag/code/play-authenticate-usage-scala/app/dao/GenericDao.scala:46: value id is not a member of type parameter ET 
[error]  def findById(id: PK): Future[Option[ER]] = db.run(tableQuery.filter(_.id === id).result.headOption) 
[error]                   ^

В основном это не признает id определение под Identifyable признака. Верхние декларации являются следующими:

trait Identifyable[PK] extends Product { 
    def id : PK 
} 

trait GenericDaoHelper { 
    val profile: slick.driver.JdbcProfile 
    import profile.api._ 

    class GenericDao[PK, ER <: Identifyable[PK], ET <: Table[ER], TQ <: TableQuery[ET]] @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) 
     (tableQuery: TQ) extends HasDatabaseConfigProvider[JdbcProfile] { 
    import driver.api._ 

    /** 
     * Returns the matching entity for the given id 
     * @param id identifier 
     * @return the matching entity for the given id 
     */ 
    def findById(id: PK): Future[Option[ER]] = db.run(tableQuery.filter(_.id === id).result.headOption) 
} 

PS: обратите внимание, что я работаю с последней Slick 3.1.1 это имеет решающее значение, потому что люди реализовали подобные решения в прошлом, но они изменяются совсем немного от версии к версия.

ответ

1

Я обнаружил предыдущую версию Slick CrudComponent gist implementation, которые не могут быть приняты точно как, но, адаптируя его к последней Slick 3.1.x тогда решает id компиляцию проблема, описанная в ОП. Решение было в основном перестановкой типов шаблонов и их границ.

Окончательное решение может быть найдено в файле GenericDao.scala

+0

Вторая ссылка («окончательное решение») сломана. Не могли бы вы сделать его доступным на GitHub, если бы вам удалось клонировать его вовремя? – JulienD

+0

Upvote заранее: D –

+0

+1 уже мой ( – JulienD

2

ET это таблица (подтип Table[ER]). Из ошибок, ясно, что ET не Rep[PK]

trait IdentifyableTable[PK] extends Table[ER] { 
    def id: Rep[PK] 
} 

Вместо того, чтобы объявить ET в качестве подтипа Table[ER]. Объявите его как подтип IdentifyableTable[PK].

Объявите ваш общий дао как этот

class GenericDao[PK, ER <: Identifyable[PK], ET <: IdentifyableTable[PK], TQ <: TableQuery[ET]] .... 
+0

Это близко, но это не решает проблему ... например, модель пользователя генерируется как 'класса пользователя (_tableTag: Tag) расширяет таблицу [UserRow ] 'поэтому' ET' в этом случае 'User' и его идентификатор генерируется как' val id: Rep [Long] ' –

+0

@GiovanniAzua Вам нужно сделать' def id: Rep [PK] 'доступным с типом' ET' , Я не думаю, что его генерация динамически – pamu