1

私は Scala Play Framework 2.2 プロジェクトに取り組んでおり、DB アクセス層として play-slick 0.5.0.8 を使用しています。

DAO オブジェクトの 1 つに次のコードがあります。

def randomByBlahAndDate(blah: Blah, newerThan: LocalDate)(implicit s: Session): Option[Photo] = {
  sql"select * from photos where blah = $blah and imgDate > $newerThan order by rand()".as[Photo].headOption
}

ご覧のとおり、rand() による順序付けなどのトリッキーな処理が行われるため、生の SQL ルートを使用することにしました。いずれにせよ、コンパイル時に次のエラーが発生します。

could not find implicit value for parameter pconv: scala.slick.jdbc.SetParameter[(models.Blah.Blah, org.joda.time.LocalDate)]

巧妙な人が両方のタイプをセットとして一緒に変換しようとしているように見えます... 奇妙です。オブジェクトBlahを挿入およびフェッチするときに適切に機能する、列挙型に暗黙的な型コンバーターがあります。Photo

def enumToStringMapper(enum: Enumeration) = MappedTypeMapper.base[enum.Value, String](
enum   => enum.toString,
string => enum.withName(string))

implicit val FormatMapper = enumToStringMapper(Blah)

コンバージョンもimport com.github.tototoshi.slick.JodaSupport._サポートします。LocalDateこれは、オブジェクトを挿入およびフェッチするときにも問題なく機能しPhotoます。

何か案は?おそらく、必要なもの (列挙型の等価性、日付の比較、rand() の順序付け) をサポートするための、より優れたクエリ メカニズムでしょうか? ありがとう。

更新: 2013-10-27

私は今、次のことをやろうとしていますが、運が悪いです:

def recordGuess(date: LocalDate, correctBlah: Blah, incorrectBlah: Blah, isCorrect: Boolean)(implicit s: Session) {
  val correctIncrement = if(isCorrect) 1L else 0L
  sqlu"insert into stats (date, correctBlah, incorrectBlah, impressions, guesses, correct) values ($date, $correctBlah, $incorrectBlah, 1, 1, $correctIncrement) on duplicate key update guesses = guesses + 1, correct = correct + $correctIncrement".first
}

繰り返しますが、機能しません:

could not find implicit value for parameter pconv: scala.slick.jdbc.SetParameter[(org.joda.time.LocalDate, models.Blah.Blah, models.Blah.Blah)]

ただし、今回は、それを回避する良い簡単な方法はありません。Typesafesqlsqluin slick は暗黙の変換をサポートしていないようです。

4

1 に答える 1