6

您将如何在 SLICK 中编写此查询?

DB.withSession  {
  implicit session =>
    Tokens.where(_.expirationTime < DateTime.now ).delete
}

DateTime.now 的类型为 org.joda.time.DateTime

_.expirationTime 是相同类型的类型映射列。

我收到这个错误

[error] UserService.scala:80: value < is not a member of scala.slick.lifted.Column[org.joda.time.DateTime]
[error]         Tokens.where(_.expirationTime < DateTime.now ).delete
[error]                                       ^
[error] one error found 

现在使用这种形式的查询。

4

3 回答 3

4

我的猜测是 JodaTime 类型不支持开箱即用的类型。如果您将该列更改为 ajava.sql.Timestamp并使用 aTimestamp作为比较值,则一切正常。如果您想在光滑的列映射中使用 joda 类型,您可能需要查看以下内容:

https://github.com/tototoshi/slick-joda-mapper

于 2013-06-16T10:29:40.290 回答
1

我会做什么:

假设您的 Token 类看起来像这样并且您使用 mysql:

import org.joda.time.DateTime
import com.github.tototoshi.slick.JdbcJodaSupport._
import play.api.db.slick.Config.driver.simple._

case class Token(
                  id: Option[Long]
                  expirationTime: Option[DateTime]                  
                 )

class Tokens(tag: Tag) extends Table[Token](tag, "Token") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc, O.Nullable)
  def expirationTime = column[DateTime]("expirationTime", O.Nullable)  

  def * = (id.?, expirationTime.?) <> (Token.tupled, Token.unapply)

}

例如。依赖项:

libraryDependencies ++= Seq(
  "com.typesafe.slick" %% "slick" % "2.1.0-M2",
  "com.typesafe.play" %% "play-slick" % "0.8.0-M1",
  "com.github.tototoshi" %% "slick-joda-mapper" % "1.2.0",
  "mysql" % "mysql-connector-java" % "5.1.26"
)

那么你需要做的就是:

import com.github.tototoshi.slick.JdbcJodaSupport._


DB.withSession  {
  implicit session =>
    Tokens.where(_.expirationTime < DateTime.now ).delete
}

如果您使用 mysql 以外的任何其他数据库,则需要更改导入和依赖项。

于 2014-11-25T14:38:49.020 回答
1

导入com.github.tototoshi.slick.JodaSupport._为我解决了这个问题。

于 2013-09-05T09:46:11.653 回答