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)
我假设你使用的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 T来Column[ 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类型的列.现在,您可以使用这些内置类型执行几乎所有操作.
| 归档时间: |
|
| 查看次数: |
2189 次 |
| 最近记录: |