2012-12-18 16 views
0

Squeryl 0.9.6版引入了一種新方法來聲明具有關聯主鍵的類through the use of the KeyedEntityDef typeclass。仍舊陳舊的方式Squeryl中的KeyedEntity 0.9.6

import org.squeryl.KeyedEntity 

case class Foo(id: Long, myField: String) extends KeyedEntity[Long] 

支持。

我想遷移一個現有的應用程序,使用Squeryl 0.9.5到新版本,使用自定義基元類型,我面臨編譯問題。這裏是一個沒有編制了

trait Retrievable[A <: KeyedEntity[Long]] { 
    def table: Table[A] 

    def get(id: Long): Option[A] = inTransaction { 
    table.lookup(id) 
    } 
} 

它本來是這樣被使用的特性的一個例子:

case class Foo(id: Long, myField: String) extends KeyedEntity[Long] 

object Foo extends Retrievable[Foo] { 
    def table = DB.something 
} 

... 

val foo = Foo.get(235) 

現在,當我嘗試編譯,我得到的消息

該方法需要一個隱式org.squeryl.KeyedEntityDef [A,龍]在 範圍,或者說,它延伸性狀KeyedEntity [{K}]

雖然A確實延伸KeyedEntity[Long]。即使增加了一個隱含的範圍,如

trait Retrievable[A <: KeyedEntity[Long]] { 
    def table: Table[A] 
    implicit val ev: <:<[A, KeyedEntity[Long]] 

    def get(id: Long): Option[A] = inTransaction { 
    table.lookup(id) 
    } 
} 

不能幫助隱式解析,並且特徵無法編譯。

有沒有人有一個線索,爲什麼編譯器不提供隱含在lookup method

回答

4

查找方法的簽名已更改,因此它接受KeyedEntityDef作爲隱式參數。爲了向後兼容,KeyedEntityDef可用於KeyedEntity類型。它在QueryDsl中找到(請參閱kedForKeyedEntities隱式方法),並將其作爲您正在使用的「TypeMode」(即PrimitiveTypeMode)的一部分導入到作用域中。簡單的回答是,你有兩個選擇:

  • 確保PrimitiveTypeMode._是在你的可回收特質被定義
  • 爲了使它更靈活的範圍,有你的get方法接受相同的參數隱含確實查找def get(id: Long)(implicit ked: KeyedEntityDef[T,K], dsl: QueryDsl): Option[A],然後通過table.lookup(id)(ked, dsl)傳遞給他們。這將推動他們的解決方案,直到你的get方法被調用,並允許它與你定義的任何自定義TypeMode一起使用。
+0

謝謝。我試過你提到的兩種解決方案。至於第一個,'PrimitiveTypeMode._'已經存在,但沒有幫助。我認爲這與隱式'KeyedEntityDef [Long,_]'必須通過從隱式'ev:A <: Andrea

+0

'方法stringCanBuildFrom在類型=> scala.collection.generic.CanBuildFrom [String,Char,String]的對象Predef中使用方法 類型爲[A,K]的特徵QueryDsl中的kedForKeyedEntities(隱式ev:<:<[A,org.squeryl.KeyedEntity [K]],隱式m:Manifest [A])org.squeryl.KeyedEntityDef [A,K]匹配預計類型 forSome {type _ $ 1}' – Andrea

+0

我的錯,您的第二個解決方案正常工作。我沒有在'Retrievable'特徵的範圍內導入'KeyedEntityDef',但是錯誤消失在一長串錯誤消息中。 – Andrea