Scala Quill无法长时间找到隐式编码器

时间:2017-11-11 19:57:36

标签: scala generics implicit encoder quill

以下代码按预期工作(笔记本电脑是案例类):

def main(args: Array[String]): 

 implicit val ctx = new SqlMirrorContext(MirrorSqlDialect, Literal)
 import ctx._

 val laptops = quote {
   querySchema[Laptop]("laptops")
 }

 implicit val laptopInsertMeta = insertMeta[Laptop](_.id)

 val q = quote {
   laptops.insert(lift(Laptop(...)))
 }
 ctx.run(q)

}

但是这个(在重构途中)版本无法编译:

class LaptopDaoQuill[I <: Idiom, N <: NamingStrategy](implicit ctx: Context[I, N])  {

 import ctx._

 def insert(obj: Laptop) = {
 val laptops = quote {
   querySchema[Laptop]("laptops")
 }
 implicit val personInsertMeta = insertMeta[Laptop](_.id)

 val q = quote {
    laptops.insert(lift(obj))
 }
 ctx.run(q)
 }
}

object Main {
def main(args: Array[String]): Unit = {
  implicit val ctx = new SqlMirrorContext(MirrorSqlDialect, Literal)

  val laptopDao = new LaptopDaoQuill

  laptopDao.insert(Laptop(...))
}

出现以下错误:

错误:(29,55)找不到隐式Encoder[Long]。请执行以下操作之一: 1.确保提供隐式Encoder[Long]并且没有其他冲突的含义; 2.制作Long Embedded案例类或AnyVal。 隐式val personInsertMeta = insertMetaLaptop

错误:(32,21)无法为类型InsertMeta找到隐式com.training.entity.Laptop       laptops.insert(升程(OBJ))

在这种情况下可以使用(确保主要使用PostgresJdbcContext):

class LaptopDaoQuill[N <: NamingStrategy : TypeTag](implicit ctx: PostgresJdbcContext[N]) {...}

但如果:

class LaptopDaoQuill[I <: Idiom : TypeTag, N <: NamingStrategy: TypeTag](implicit ctx: Context[I, N])

提前致谢!

1 个答案:

答案 0 :(得分:0)

I <: Idiom替换为I <: SqlIdiom,将implicit ctx: Context[I, N]替换为implicit ctx: JdbcContext[I, N]

以下代码编译:

import io.getquill._
import io.getquill.context.jdbc.JdbcContext
import io.getquill.context.sql.idiom.SqlIdiom

case class Laptop(id: Long, name: String)

class LaptopDaoQuill[I <: SqlIdiom, N <: NamingStrategy](implicit ctx: JdbcContext[I, N]) {

  import ctx._

  def insert(obj: Laptop) = {
    val laptops = quote {
      querySchema[Laptop]("laptops")
    }
    implicit val personInsertMeta = insertMeta[Laptop](_.id)

    val q = quote {
      laptops.insert(lift(obj))
    }
    ctx.run(q)
  }
}

object Main {
  def main(args: Array[String]): Unit = {
//    implicit val ctx = new SqlMirrorContext(MirrorSqlDialect, Literal)
    implicit val ctx = new PostgresJdbcContext(SnakeCase, "ctx")

    val laptopDao = new LaptopDaoQuill

    laptopDao.insert(Laptop(10L, "laptop"))
  }
}