>我有一个这样的配套对象:
object Addresses extends Table[Address]("address"){
//some mapping columns
....
//a method I want to made generic
def findAll(limit: Option[Int], offset: Option[Int]): Seq[Address] = DBTest.db.withSession { implicit db: Session =>
(limit, offset) match {
case (Some(l), Some(o)) => Addresses.map { a => a }.drop(o).take(l).list
case (None, None) => Addresses.map { a => a }.drop(ConfigurationsLoader.DefaultOffset).take(ConfigurationsLoader.DefaultLimit).list
case (Some(l), None) => Addresses.map { a => a }.take(l).list
case (None, Some(o)) => Addresses.map { a => a }.drop(o).list
}
}
的案例类Address
.
因为我有很多这样的对象(每个对象定义一个表),所以我想在一个特征中移动findAll
方法,使其成为通用的,我尝试这样做:
trait DbGenericOperations[T, U <: Table[T]]{
val entities: U
/**
* Based on REST conventions, for listing it's good to use limit and offset, like: /entities?limit=25&offset=50.
*/
def findAll(limit: Option[Int], offset: Option[Int]): Seq[T] = DBTest.db.withSession { implicit db: Session =>
(limit, offset) match {
case (Some(l), Some(o)) => entities.map { a => a }.drop(o).take(l).list
case (None, None) => entities.map { a => a }.drop(ConfigurationsLoader.DefaultOffset).take(ConfigurationsLoader.DefaultLimit).list
case (Some(l), None) => entities.map { a => a }.take(l).list
case (None, Some(o)) => entities.map { a => a }.drop(o).list
}
}
}
正如你所注意到的,entities
基本上是我的伴侣对象。
现在的问题是我不能像这样重写我的对象定义:
object Addresses extends Table[Address]("address") with DbGenericOperations[Address, Addresses]{
因为它说Addresses
不是一种类型...
我对 scala 很陌生,我想知道:有什么办法解决这个问题吗?
更新:我是这样做的:
trait DbGenericOperations[T]{
/**
* Based on REST conventions, for listing it's good to use limit and offset, like: /entities?limit=25&offset=50.
*/
def findAll(limit: Option[Int], offset: Option[Int], entities: Table[T]): Seq[T] = DBTest.db.withSession { implicit db: Session =>
(limit, offset) match {
case (Some(l), Some(o)) => entities.map { a => a }.drop(o).take(l).list
case (None, None) => entities.map { a => a }.drop(ConfigurationsLoader.DefaultOffset).take(ConfigurationsLoader.DefaultLimit).list
case (Some(l), None) => entities.map { a => a }.take(l).list
case (None, Some(o)) => entities.map { a => a }.drop(o).list
}
}
}
并像这样声明伴随对象: object Addresses extends Table[Address]("address") with DbGenericOperations[Address]
但我不喜欢使用这种方法:
val results = Addresses.findAll(limit, offset, Addresses)
如果有更好的解决方案,请告诉我...
为什么不创建一个类/特征 RichTable[T](...) 扩展 Table[T](...) 这将添加此方法?