Why does the compiler report error for custom generic DAO?

95 Views Asked by At

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]

0

There are 0 best solutions below