2015-11-16 3 views
1

Я пытаюсь определить поле даты с нулевым значением в postgres, используя аноним в качестве подключения к базе данных.Play framework - Использование anorm с опцией [LocalDate] Option [LocalDateTime]

Я пытаюсь обновить запись:

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) 
} 

}

Что я здесь отсутствует? Спасибо!

+1

Попробуйте добавить 'импорт JodaParameterMetaData._' –

+0

Спасибо !! работал! – Tomer

+0

@Lars Arnbak, что относительно опции [LocalDate], нужно импортировать что-то еще? – Tomer

ответ

0

я добавил свои собственные неявные определения:

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 
} 

Это сделал трюк

+0

Да, это сработает. Однако должны быть в состоянии сделать 'VAL парсер: RowParser [Info] = { импорт JodaParameterMetaData._ получить [Long] ("ID") ~ получить [Option [DateTime]] ("Дата_начала") Карта { case id ~ startTime => Info (id, startDate) } ' И вам нужны типы. –

Смежные вопросы