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?