以下代码按预期工作(笔记本电脑是案例类):
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])
提前致谢!
答案 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"))
}
}