Scala Quill 长时间找不到隐式编码器
Scala Quill can't find implicit encoder for long
以下代码按预期工作(笔记本电脑是一个案例class):
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
设为 class 或 AnyVal
。
隐式 val personInsertMeta = insertMetaLaptop
错误:(32, 21) 找不到类型 com.training.entity.Laptop
的隐式 InsertMeta
laptops.insert(电梯(obj))
在那种情况下会起作用(确保在 main 中使用 PostgresJdbcContext):
class LaptopDaoQuill[N <: NamingStrategy : TypeTag](implicit ctx: PostgresJdbcContext[N]) {...}
但如果 :
class LaptopDaoQuill[I <: Idiom : TypeTag, N <: NamingStrategy: TypeTag](implicit ctx: Context[I, N])
提前致谢!
将 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"))
}
}
以下代码按预期工作(笔记本电脑是一个案例class):
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
设为 class 或 AnyVal
。
隐式 val personInsertMeta = insertMetaLaptop
错误:(32, 21) 找不到类型 com.training.entity.Laptop
的隐式 InsertMeta
laptops.insert(电梯(obj))
在那种情况下会起作用(确保在 main 中使用 PostgresJdbcContext):
class LaptopDaoQuill[N <: NamingStrategy : TypeTag](implicit ctx: PostgresJdbcContext[N]) {...}
但如果 :
class LaptopDaoQuill[I <: Idiom : TypeTag, N <: NamingStrategy: TypeTag](implicit ctx: Context[I, N])
提前致谢!
将 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"))
}
}