【发布时间】:2014-02-12 13:50:50
【问题描述】:
我厌倦了总是执行以下类似的操作,以便为我的每个域实体使用 slick 进行数据库访问。
database withSession {
implicit session =>
val entities = TableQuery[EntityTable]
val id = //Some ID
val q = for {
e <- entities if e.id === id
} yield (e)
val entity = q.first
}
(注意:EntityTable 的定义如 here 所述)
所以我决定我需要一个通用的数据库访问对象来为我处理这个问题。用法应该类似于
[...]
val entityDAO = new GenericDAO[Entity, EntityTable, String]()
[...]
database withSession { implicit session =>
val id = // Some ID
val entity = entityDAO.get(id)
}
我对实现 GenericDAO 的尝试如下所示
class GenericDAO[T, TB, PK](implicit session: Session) {
val entities = TableQuery[TB] // Line 1
def get(id: PK): T = {
val q = for {
e <- entities
} yield (e)
val res: T = q.first
res
}
}
但是第 1 行给我留下了一个编译器错误,指出 TB 参数有问题。
此行有多个标记 - 类型参数 [TB] 不符合任何重载替代值的界限:[E <: scala.slick.lifted.abstracttable>]]=> scala.slick.lifted.TableQuery[E,E#TableElementType] [E <: scala.slick.lifted.abstracttable>]](缺点:scala.slick.lifted.Tag => E)scala.slick.lifted.TableQuery[E,E#TableElementType] - 重载方法值的类型参数数量错误适用于替代方案:[E <: scala.slick.lifted.abstracttable>]]=> scala.slick.lifted.TableQuery[E,E#TableElementType] [E <:> scala.slick.lifted.AbstractTable[]](缺点:scala.slick.lifted.Tag => E)scala.slick.lifted.TableQuery[E,E#TableElementType]
对这个问题有什么建议吗?或者也许我错了,它应该以另一种方式实现。我愿意接受任何解决方案。谢谢!
【问题讨论】: