I'm trying to make a generic DAO class to use in all my DAO objects.
I have the following auto-generated Slick models (in a file dbTables.Tables
):
case class UserusergroupsRow(userusergroupid: Int, usergroupid: Int, userid: Int, status: String, createdby: Option[String], createddate: Option[java.sql.Timestamp], lastupdatedby: Option[String], lastupdateddate: Option[java.sql.Timestamp])
class Userusergroups(tag: Tag) extends Table[UserusergroupsRow](tag, "userUserGroups") {
def * = (userusergroupid, usergroupid, userid, status, createdby, createddate, lastupdatedby, lastupdateddate) <> (UserusergroupsRow.tupled, UserusergroupsRow.unapply)
/** Maps whole row to an option. Useful for outer joins. */
def ? = (userusergroupid.?, usergroupid.?, userid.?, status.?, createdby, createddate, lastupdatedby, lastupdateddate).shaped.<>({r=>import r._; _1.map(_=> UserusergroupsRow.tupled((_1.get, _2.get, _3.get, _4.get, _5, _6, _7, _8)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported."))
/** Database column userUserGroupId PrimaryKey */
val userusergroupid: Column[Int] = column[Int]("userUserGroupId", O.PrimaryKey)
/** Database column userGroupId */
val usergroupid: Column[Int] = column[Int]("userGroupId")
/** Database column userId */
val userid: Column[Int] = column[Int]("userId")
/** Database column status */
val status: Column[String] = column[String]("status")
/** Database column createdBy */
val createdby: Column[Option[String]] = column[Option[String]]("createdBy")
/** Database column createdDate */
val createddate: Column[Option[java.sql.Timestamp]] = column[Option[java.sql.Timestamp]]("createdDate")
/** Database column lastUpdatedBy */
val lastupdatedby: Column[Option[String]] = column[Option[String]]("lastUpdatedBy")
/** Database column lastUpdatedDate */
val lastupdateddate: Column[Option[java.sql.Timestamp]] = column[Option[java.sql.Timestamp]]("lastUpdatedDate")
}
With this I'm trying to create an abstract class as follows:
abstract class genericDao[tableClassType<:Table[caseClassType],caseClassType]{
//var a:caseClassType
//var b:tableClassType
val tableQuery : TableQuery[tableClassType]
def getAllfrom = DB.withTransaction{
implicit session => tableQuery.list
}
def saveT(obj:caseClassType) = DB.withTransaction{
implicit session => tableQuery+=obj
}
}
And here's my DAO object:
object userDao extends genericDao[Userusergroups,UserusergroupsRow] {
val tableQuery = TableQuery[Userusergroups]
//create a new user
}
When I try to invoke userDao.getAllfrom
the compiler shows error:
type arguments [dbTable.Tables.Userusergroups,dbTable.Tables.UserusergroupsRow] do not conform to class genericDao's type parameter bounds [tableClassType <: play.api.db.slick.Config.driver.simple.Table[caseClassType],caseClassType]