Slick 3 wiederverwendbares generisches Repository

Ich habe Probleme damit, Slicks TableQuery allgemein zu verwenden.

Beobachten Sie die normale Situation:

class AccountRepository {
override protected val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
val accounts = TableQuery[Accounts]
def all = db.run(accounts.result)
...

Die Idee wäre, alles Mögliche in allgemeine Merkmale oder abstrakte Klassen zu extrahieren, um Wiederholungen zu vermeiden. Der Einfachheit halber habe ich nur den problematischen Code eingefügt.

abstract class GenericRepository[T] extends HasDatabaseConfig[JdbcProfile] {
override protected val dbConfig = DatabaseConfigProvider.get[JdbcProfile(Play.current)
val table = TableQuery[T]
}

Und um es zu benutzen wie:

class AccountRepository extends GenericRepository[Accounts] {

Das erzeugt jedoch einen Kompilierungsfehler:

type-Argumente [T] entsprechen den Grenzen keiner der überladenen Wertealternativen: [E <: slick.lifted.AbstractTable ]] => slick.lifted.TableQuery [E] [E <: slick.lifted.AbstractTable ]] (cons: slick.lifted.Tag => E) slick.lifted.TableQuery [E]

Versuchen, das Problem durch Festlegen einer Grenze zu beheben, hilft ebenfalls nicht.

abstract class GenericRepository[T <: slick.lifted.AbstractTable[T]] extends HasDatabaseConfig[JdbcProfile] {

Am Ende haben wir jedoch einen anderen Fehler:

class Typ erforderlich, aber T gefunden

n folgendem Ort:

val table = TableQuery[T]

Hast du eine Idee für die Lösung?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage