0

Squerylのバージョン0.9.6では、 typeclassを使用して、KeyedEntityDef主キーが関連付けられているクラスを宣言する新しい方法が導入されています。まだ古い宣言方法

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、Long]が必要であるか、トレイト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)
  }
}

暗黙の解決には役立ちません。また、トレイトはコンパイルに失敗します。

コンパイラがルックアップメソッドで暗黙的にフィードしない理由を誰かが知っていますか?

4

1 に答える 1

4

ルックアップ メソッドの署名が変更され、KeyedEntityDef を暗黙的なパラメーターとして受け入れるようになりました。下位互換性のために、KeyedEntity 型で使用できる KeyedEntityDef があります。これは QueryDsl にあり (kedForKeyedEntities 暗黙的メソッドを参照)、使用している「TypeMode」(つまり PrimitiveTypeMode) の一部としてスコープにインポートされることを意図しています。簡単な答えは、次の 2 つの選択肢があるということです。

  • PrimitiveTypeMode._ が Retrievable トレイトが定義されているスコープ内にあることを確認してください
  • より柔軟にするために、 get メソッドがルックアップと同じ暗黙的なパラメーターを受け入れ、def get(id: Long)(implicit ked: KeyedEntityDef[T,K], dsl: QueryDsl): Option[A]それらを .xml に渡すようにしtable.lookup(id)(ked, dsl)ます。これにより、 get メソッドが呼び出されるまで解像度がオフになり、定義したカスタム TypeMode で使用できるようになります。
于 2012-12-18T22:49:35.187 に答える