【问题标题】:Play framework - Using anorm with Option[LocalDate] \ Option[LocalDateTime]播放框架 - 使用带有 Option[LocalDate] \ Option[LocalDateTime] 的 anorm
【发布时间】:2016-02-17 06:48:32
【问题描述】:

我正在尝试在 postgres 中定义一个可为空的日期字段,同时使用 anorm 作为与数据库的连接。

我正在尝试更新条目:

def update(id: Long, startTime: Option[LocalDate]){
   SQL("""UPDATE my_table
        |SET start_date = {start_date}
        |WHERE id = {id}
      """.stripMargin)
      .on(
        'id ->id,
        'start_date -> startDate,
      ).executeUpdate()
 }

但我得到一个编译错误,看起来 anorm 无法处理 Option[DateTime],尽管当我配置解析器时它对我有效:

val parser: RowParser[Info] = {
  get[Long]("id") ~
  get[Option[DateTime]]("start_date") map {
  case id ~ startTime => Info(id, startDate)
}

}

我在这里缺少什么? 谢谢!

【问题讨论】:

  • 尝试添加import JodaParameterMetaData._
  • @Lars Arnbak Option[LocalDate] 怎么样,需要导入别的东西吗?
  • 或选项[LocalDateTime]
  • @cchantep 这并没有解决我的问题。您必须为异常添加相关的隐式定义才能处理 LocalDate。我还编辑了我的解决方案以包含 ParameterMetaData 类。

标签: scala datetime playframework-2.0 anorm


【解决方案1】:

我添加了自己的隐式定义:

implicit def rowToLocalDate: Column[LocalDate] = Column.nonNull {(value, meta) =>
   val MetaDataItem(qualified, nullable, clazz) = meta
   value match {
      case ts: java.sql.Timestamp => Right(new LocalDate(ts.getTime))
      case d: java.sql.Date => Right(new LocalDate(d.getTime))
      case str: java.lang.String => Right(fmt.parseLocalDate(str))
      case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass) )
}

}

implicit val localDateToStatement = new ToStatement[LocalDate] {
    def set(s: java.sql.PreparedStatement, index: Int, aValue: LocalDate): Unit = {
       s.setTimestamp(index, new java.sql.Timestamp(aValue.toDateTimeAtStartOfDay().getMillis()))
}

}

以及相关的ParameterMetaData

implicit object LocalDateClassMetaData extends  ParameterMetaData[LocalDate] {
   val sqlType = ParameterMetaData.DateParameterMetaData.sqlType
   val jdbcType = ParameterMetaData.DateParameterMetaData.jdbcType
}

成功了

【讨论】:

  • 是的,这行得通。不过应该可以做到val parser: RowParser[Info] = { import JodaParameterMetaData._ get[Long]("id") ~ get[Option[DateTime]]("start_date") map { case id ~ startTime => Info(id, startDate) }并且有你需要的类型。
【解决方案2】:

相关问题,Anorm compare/search by java.time LocalDateTime 对我有用的只是更新到新版本(尚未发布)

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多