2017-11-11 25 views
0

다음 코드에 대한 암시 인코더를 찾을 수 없습니다 : 다음과 같은 오류와스칼라 퀼은 예상대로 작동합니다 (노트북이 경우 클래스가) 긴

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. LongEmbedded 사례 클래스 또는 AnyVal으로 만드십시오. 암시 발 personInsertMeta = insertMetaLaptop

오류 : (32, 21) 암시 적 유형 com.training.entity.Laptop laptops.insert에 대한 InsertMeta (리프트 (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

I <: IdiomI <: SqlIdiom으로, implicit ctx: Context[I, N]implicit ctx: JdbcContext[I, N]으로 바꿉니다.

다음 코드는 컴파일 : 클래스 컨텍스트는 [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")) 
    } 
} 
+0

, 경우 JdbcContext [방언 <: SqlIdiom, 명명 <:의 NamingStrategy] (은 dataSource : 닫기 가능한과 데이터 소스) 문맥 [Dialect, Naming]을 확장합니까? –

+0

일반적인 Context 필요한 implicits (Encoder, InsertMeta)에 대한 더 구체적인 컨텍스트 (PostgresJdbcContext 또는 JdbcContext)가 정의되지 않았기 때문에. 예를 들어 JdbcContext의 경우 [여기] (https://github.com/getquill/quill/blob/master/quill-jdbc/src/main/scala/io/getquill/context/jdbc/Encoders.scala#L51) 정의됩니다.) 및 [여기] (https://github.com/getquill/quill/blob/master/quill-core/src/main/scala/io/getquill/dsl/MetaDsl.scala#L10). 'JdbcContext <: Context' 외에도'JdbcContext <: Encoders'도 있습니다. 따라서 JdbcContext와 Context 사이의 엔코더 차이점은 명확합니다. –

+0

InsertMeta와 관련하여'JdbcContext <: SqlContext <: Context <: CoreDsl <: MetaDsl'과'Context <: CoreDsl <: MetaDsl'이므로 매크로의 차이점을 읽어야합니다. –