使用ScalaQuery的通用存储库

时间:2012-04-22 13:44:06

标签: scala generics repository scalaquery

我正在使用伟大的ScalaQuery,我正在尝试为常见操作创建一个通用存储库,但我并不相处它。希望有人可以提供帮助。

我有例如以下结构

abstract class Record(id : Int) 
class Product(id: Int,name:String,price : Int) extends Record(id)
class Order(id: Int,name:String,amount: Int)  extends Record(id)

和产品和订单的两个表。现在我想要通用存储库:

trait RecordRepository[T <: ExtendedTable[O]]{
     findById(id:Int) : Option[T]
     findAll() : List[T]
     save(entity:T)
     ...
}      

class ProductRepository extends RecordRepository[Product]
class ProductRepository extends RecordRepository[Order]

object ProductTable extends ExtendedTable[(Long, String, Int)]("product") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc) 
  def name = column[String]("name", O.NotNull) 
  def price = column[Int]("price", O.NotNull) 
  def * = id ~ name ~ price 
} 
object OrderTable extends ExtendedTable[(Long, String, Int)]("order") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc) 
  def name = column[String]("name", O.NotNull)
  def amount = column[Int]("price", O.NotNull) 
  def * = id ~ name ~ amount
}

我无法使用for comprehension来实现查询,因为在特征(或抽象类)RecordRepository中编译时不知道描述该表的元组。

提前致谢!

1 个答案:

答案 0 :(得分:1)

@singy好的,好的,以为你离开那个(映射)了(你应该编辑你的答案,而不是将映射放在评论中,顺便说一句)。

请尝试以下方法:
1)将class Product更改为case class Product
2)将ExtendedTable[(Long, String, Int)]替换为ExtendedTable[Product]