Scala:oraclejdbc通用与Quill

Scala:oraclejdbc通用与Quill,scala,quill,Scala,Quill,我试图将广义类作为参数传递。如果我给出Case类和值,那么它工作得很好。但是,我想让它通用 class DB[T] { lazy val ctx = new OracleJdbcContext(SnakeCase, "ctx") import ctx._ def insert(input: T) = { val q = quote { query[T].insert(lift(input)) } ctx.run(q) } } 我得到的

我试图将广义类作为参数传递。如果我给出Case类和值,那么它工作得很好。但是,我想让它通用

class DB[T] {
  lazy val ctx = new OracleJdbcContext(SnakeCase, "ctx")

  import ctx._

  def insert(input: T) = {
    val q = quote {
      query[T].insert(lift(input))
    }
    ctx.run(q)

  }

}
我得到的错误是:: “找不到类型
t
找不到类型“t”的编码器。请注意,编码器是不变的

但是,如果我给出了实际的类名,那么它运行得很好

case class Location(street:String,pinCode:Int)

class DB {
  lazy val ctx = new OracleJdbcContext(SnakeCase, "ctx")
  import ctx._
  val q = quote {
      query[Location].insert(Location("2ndcross",500001))
    }
    ctx.run(q)

}

您需要在作用域中具有
SchemaMeta[T]
,才能使用此类型执行查询。虚拟解决方案是像这样要求它作为参数约束(以及隐式类参数)

class DB[T: SchemaMeta]
但这是行不通的,因为提供这些实例的是
ctx

我相信您需要遵循以下示例: 但即便如此,你想要的也可能无法实现

使用quill时需要了解的重要一点是,几乎所有的东西都是基于宏的,如果你把东西抽象出来,那么就没有足够的信息让这些宏发挥作用。因此,您要么需要复制需要宏的代码,要么在自己的宏中包装泛型代码