Slick不知道如何映射给定类型 - Option(DateTime.now)

问题描述 投票:1回答:1

我正在尝试这样做(在Play Framework上):

db.run(users.filter(_.id === id).map(_.deleted).update(Option(DateTime.now)))

但它抛出了一个编译错误:

找不到匹配的形状。 Slick不知道如何映射给定的类型。可能的原因:表[T]中的T与您的*投影不匹配,您在查询中使用不受支持的类型(例如scala列表),或者您忘记将驱动程序api导入范围。所需级别:slick.lifted.FlatShapeLevel源类型:slick.lifted.Rep [Option [org.joda.time.DateTime]]解包类型:T压缩类型:G

Slick 3.0.3的版本。我该如何修复这个错误?

class UserTable(tag: Tag) extends Table[User](tag, "user") {

  def id = column[Int]("id")

  def name = column[String]("name")

  def age = column[Int]("age")

  def deleted = column[Option[DateTime]]("deleted")

  override def * =
    (id, name, age, deleted) <> ((User.apply _).tupled, User.unapply)
}

case class User(
  id: Int = 0,
  name: String,
  age: Int,
  deleted: Option[DateTime] = None
)
scala playframework slick
1个回答
0
投票

定义表时,DateTime的范围内有一个列类型映射器。就像是

implicit val dtMapper = MappedColumnType.base[org.joda.time.DateTime, Long](
  dt => dt.getMillis,
  l => new DateTime(l, DateTimeZone.UTC)
)

例如。此映射器也必须位于构造查询的位置,否则Slick将不知道如何将您编写的内容转换为SQL查询。

如果要将查询与表分开,可以导入映射器,或者在定义UserTable的同一文件中定义查询。一种常见的模式是将表包装在特征中,比如UserRepository,并在该特征中定义表和查询。

See this page有关隐式范围如何工作的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.