1

以下のコードは、示されているようにコンパイルされ、正常に動作します。ただし、Some("SomeConstant") を生成しようとすると、以下に示す実行時エラーが発生します。

これはなぜですか?クエリから式 (たとえば、Some(...)) を返すにはどうすればよいですか?

  def cannotUnpack(db: Database) {
    db.withSession {
      val data = (for {
        rw1 <- TableOne
        rw2 <- TableTwo if rw1.cl1 === rw2.cl1 && rw1.cl2 === rw2.cl2 && rw1.cl1 === "0"
        now = new Timestamp(System.currentTimeMillis())
        six = 6
      } yield (uuid, rw1.cl3, "SomeConstant", six, now) ).list // Works
//    } yield (uuid, rw1.cl3, Some("SomeConstant"), six, now) ).list // Runtime error
    }
  }

実行時エラー: 展開方法がわからない (String, scala.slick.lifted.Column[Option[String]], Some[String], scala.slick.lifted.Column[Int], scala.slick.lifted.Column [java.sql.Timestamp]) を T に、G にパックします
rw2 <- TableTwo if rw1.cl1 === rw2.cl1 && rw1.cl2 === rw2.cl2 && rw1.cl1 === "0"
^

環境: Ubuntu 上の scala 2.10、Java 7 Slick 1.0.0、SQL Server、JTDS ドライバー

4

2 に答える 2

1

短い答え: と書くとうまくいきます Some("SomeConstant") : Option[String]

長い答え: Slick クエリの一部として定数を指定した場合、Slick はその値を SQL クエリに入れ、後で結果から読み戻さなければなりません。これにより、構成可能性が維持されます。つまり、Slick クエリを別の Slick クエリのコンポーネントとして使用できます。値を SQL クエリにエンコードするために、呼び出しているメソッド (内包表記の場合: map または flatMap) は TypeMapper[T] 型の暗黙の値を見つける必要があります。ここで、T は値の型です。Slick は TyperMapper[Option[String]] を定義しますが、問題は Some("SomeConstant") が Some[String] 型で TypeMapper[Some[String]] が定義されていないため、あなたのケースには適用されないことですSlick で (そして TypeMapper[T] は T で不変です)。:Option[String] を明示的に指定することで、型情報を緩めて、一致する TypeMapper を見つけることができます。

Some 型の定数のサポートを Slick に追加できるかどうかを検討します。チケットを追加しました ( https://www.assembla.com/spaces/typesafe-slick/tickets/268 )。次のチーム ミーティングで取り上げます。

于 2013-06-14T02:45:07.797 に答える