5

優れた squeryl ORM フレームワークを使用して単純な BaseDao クラスを作成しようとしています。

ただし、一般的な型付きキーを使用すると問題が発生しました。ジェネリック BaseDao クラスで「===」演算子を使用しようとすると、コンパイル エラーが発生します。コンパイル エラー:値 === は型パラメーター TKey のメンバーではありません

面倒なメソッドを持つ私の dao クラスは次のように定義されています。

import org.squeryl.PrimitiveTypeMode._
import org.squeryl._

abstract class BaseDao[TKey, T <: BaseEntity[TKey]](val table: Table[T]) {

  def delete(entity: T) : Boolean = {
    table.deleteWhere(record => record.id === entity.id) //This is where I get the compile error
  }
}

BaseEntity は次のように定義されます。

abstract class BaseEntity[TKey] extends KeyedEntity[TKey]

私も Dao クラスに PrimitiveTypeMode をインポートします...私の最初のことは、TKey を === 演算子が制約されているものに制約する必要があることでしたが、ソースを見ると、明示的な制約がないようですオペレーターなので、少し迷っています。

演算子は、ここの squeryl のソースで定義されています: https://github.com/max-l/Squeryl/blob/master/src/main/scala/org/squeryl/dsl/TypedExpression.scala

4

1 に答える 1

0

これは Squeryl ではできないと思います。Squeryl はジェネリックに型指定されたキーをサポートしていません。Java リフレクションを使用してその型を取得しますが、これは実行時に消去されるため、それらは Object 型であると見なされます。

于 2013-08-29T16:09:48.457 に答える