Scala Slick发现所有日期时间都小于DateTime.now()

Chr*_*art 1 scala slick slick-2.0

我正在尝试编写一个简洁的Scala Slick查询来查找小于当前的所有日期时间DateTime.now().我继续得到编译问题而Column[DateTime]不能与普通人相提并论DateTime.编写此Scala Slick查询的正确方法是什么?

列定义是

def expirationTime = column[DateTime]("EXPIRATION_TIME")
Run Code Online (Sandbox Code Playgroud)

和我想写的查询:

table.filter(_.expirationTime < DateTime.now())
Run Code Online (Sandbox Code Playgroud)

Sar*_*ngh 7

我假设你使用的lifted-embedding是Silck.

所以... Slick使用一个概念,称为lifted-embeddingScala类型lifted(使用适当的Rep构造函数创建一个lifted-representationScala类型).现在,对于每个类型的列Column[ T ]都是子类型Rep[ T ]TypedType[ T ]必须存在,这是impliticty任何查询所必需的.

您的特定filter查询具有以下签名,

def filter[T](f: (E) ? T)(implicit wt: CanBeQueryCondition[T]): Query[E, E.TableElementType]
Run Code Online (Sandbox Code Playgroud)

在这里,这种隐含价值wt类型CanBeQueryCondition[T]为的子类型( T ) => Column[ _ ],并在内部使用解除(转换)你的价值type TColumn[ T ].所以......你需要有一个能够做这个查询的implicit实例CanBeQueryCondition[ DateTime ].

除此之外,对于基于JDBC的数据库,仅支持以下原始类型.

Numeric types: Byte, Short, Int, Long, BigDecimal, Float, Double
LOB types: java.sql.Blob, java.sql.Clob, Array[Byte]
Date types: java.sql.Date, java.sql.Time, java.sql.Timestamp
Boolean
String
Unit
java.util.UUID
Run Code Online (Sandbox Code Playgroud)

这意味着......您将不得不使用java.sql.TimeStamp.

或者您可以编写自己的自定义映射器,它将提供DataTime色谱柱所需的所有样板.

import scala.slick.driver.JdbcProfile.MappedColumnType
import java.sql.Date
import org.joda.time.DateTime 

object MyCustomMappers {

  implicit def dateTimeMapper = MappedColumnType.base[DateTime, Date] (
    { dateTime => new Date(dateTime.getMillis) },
    { date => new DateTime(date) }
  )

}
Run Code Online (Sandbox Code Playgroud)

现在,在您的模式中,您可以只import MyCustomMappers._定义DateTime类型的列.现在,您可以使用这些内置类型执行几乎所有操作.