Scala Slick在原始SQL查询中隐式转换多个类型

时间:2013-10-23 07:10:24

标签: mysql scala playframework playframework-2.0 slick

我正在开发一个Scala Play Framework 2.2项目,我正在使用play-slick 0.5.0.8作为我的数据库访问层。

我的一个DAO对象中有以下代码:

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)]

但是,这次我看不到好的,简单的方法。看起来像Typesafe的sqlsqlu一样不支持隐式转换。

1 个答案:

答案 0 :(得分:0)

我无法找到隐式转换问题的解决方案,但我找到了一种使用更传统的光滑语法的解决方法,scala.util.Random.shuffle

def randomByBlahAndDate(blah: Blah, newerThan: LocalDate)(implicit s: Session): Option[Photo] = {
  val photos = Query(Photos).where(_.imgDate > newerThan).where(_.blah === blah).run
  val r = new scala.util.Random(scala.compat.Platform.currentTime)
  r.shuffle(photos).headOption
}

与使用MySQL的rand()相比,我不确定效率,但这暂时可以使用。