我正在开发一个 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)]
看起来好像 slick 正试图将我的两种类型转换在一起,作为一个集合......奇怪。我的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)]
但是,这一次我看不到好的,简单的方法。似乎 Typesafesql
和sqlu
in slick 不支持隐式转换。