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

时间:2019-03-13 22:12:56

标签: scala playframework slick

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

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

但是它会引发编译错误:

  

未找到匹配的形状。光滑不知道如何映射给定   类型。可能的原因:表[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
)

1 个答案:

答案 0 :(得分:0)

定义表时,<MenuForm />的作用域中有一个列类型映射器。像

DateTime

例如。该映射器还必须在构造查询的位置的作用域内,否则Slick将不知道如何将您编写的内容转换为SQL查询。

如果要使查询与表分开,则可以导入映射器,也可以在定义implicit val dtMapper = MappedColumnType.base[org.joda.time.DateTime, Long]( dt => dt.getMillis, l => new DateTime(l, DateTimeZone.UTC) ) 的同一文件中定义查询。一种常见的模式是将表包装为特征,例如UserTable,然后定义表和该特征中的查询。

See this page,了解有关隐式作用域如何工作的更多信息。