在原始的SQL查询多种类型的斯卡拉油滑隐式转换(Scala Slick implicit conve

2019-10-18 20:17发布

我工作的一个斯卡拉播放框架2.2的项目,我使用的播放光滑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)]

然而,这个时候,我看到周围没有很好的,简单的方法。 好像类型安全的sqlsqlu在光滑不支持隐式转换。

Answer 1:

我一直没能找到解决的隐式转换的问题,但我发现使用更传统的光滑语法一种变通方法,以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()但是这会暂时工作。



文章来源: Scala Slick implicit conversion of multiple types in raw SQL query