2016-06-27 1 views
0

Я добавляю два дополнительных поля в таблицу Person: Date и String. Я создал вкладку Person и сопоставил ее с Play Slick, следуя olivebh's tutorial. Однако, я получаю следующий erros от Slick модели данных признака таблицы:Play Slick обработка Дата с соответствующими формами и имплицитами

dao/Tables.scala:85: ambiguous implicit values: 
[error] both value e3 of type slick.jdbc.GetResult[String] 
[error] and value e1 of type slick.jdbc.GetResult[String] 
[error] match expected type slick.jdbc.GetResult[String] 
[error]  ProjectRow.tupled((<<[Int], <<[String], <<[Date], <<[String])) 

, которая относится к следующей строке:

implicit def GetResultPersonRow(implicit e0: GR[Int], e1: GR[String], e2: GR[Date], e3: GR[String]): GR[ProjectRow] = GR { 
prs => 
    import prs._ 
    PersonRow.tupled((<<[Int], <<[String], <<[Date], <<[String])) 

}

где «INT, строка, дата , строка "представляют поля" id, name, birthdate, language "соответственно. Все работало нормально, следуя руководству, которое включает в себя пример «id, name». Но как только я добавил дату рождения и язык, я получил приведенную выше ошибку.

Кроме того, при создании прототипов для строк таблицы:

class Person(_tableTag: Tag) extends Table[PersonRow](_tableTag, "person") { 
    def * = (personId, name, birthdate, language) <>(PersonRow.tupled, PersonRow.unapply) 

    def ? = (Rep.Some(personId), Rep.Some(name), Rep.Some(birthdate), Rep.Some(language)).shaped.<>({ r => import r._; _1.map(_ => ProjectRow.tupled((_1.get, _2.get, _3.get, _4.get))) }, (_: Any) => throw new Exception("Inserting into ? projection not supported.")) 

    val personId: Rep[Int] = column[Int]("person_id", O.AutoInc, O.PrimaryKey) 
    val name: Rep[String] = column[String]("name", O.Length(50, varying = true)) 
    val birthdate: Rep[Date] = column[Date]("birthdate", O.Length(50, varying = true)) 
    val language: Rep[String] = column[String]("language", O.Length(50, varying = true)) 

я получаю следующие ошибки:

No matching Shape found. 
[error] Slick does not know how to map the given types. 
[error] Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List). 
[error] Required level: slick.lifted.FlatShapeLevel 
[error]  Source type: (slick.lifted.Rep[Int], slick.lifted.Rep[String], slick.lifted.Rep[java.util.Date], slick.lifted.Rep[String]) 
[error] Unpacked type: (Int, String, java.util.Date, String) 
[error]  Packed type: Any 
[error]  def * = (personId, name, birthdate, language) <>(PersonRow.tupled, PersonRow.unapply) 

, а также:

dao/Tables.scala:94: could not find implicit value for parameter od: slick.lifted.OptionLift[Tables.this.driver.api.Rep[java.util.Date],O] 
[error]  def ? = (Rep.Some(personId), Rep.Some(name), Rep.Some(birthdate), Rep.Some(language)).shaped.<>({ r => import r._; _1.map(_ => PersonRow.tupled((_1.get, _2.get, _3.get, _4.get))) }, (_: Any) => throw new Exception("Inserting into ? projection not supported.")) 
dao/Tables.scala:94: not found: value _1 
[error]  def ? = (Rep.Some(personId), Rep.Some(name), Rep.Some(birthdate), Rep.Some(language)).shaped.<>({ r => import r._; _1.map(_ => PersonRow.tupled((_1.get, _2.get, _3.get, _4.get))) }, (_: Any) => throw new Exception("Inserting into ? projection not supported.")) 

Любая помощь в понимании этих ошибки и, следовательно, как я мог бы изменить Slick data model trait, чтобы он мог rly обрабатывать два дополнительных поля Date и String, было бы весьма полезно. Спасибо огромное!

ответ

1

Слик не может обрабатывать java.util.Date, поскольку базы данных понимают только java.sql.Date через драйверы JDBC. Вы можете сделать свой собственный картограф, чтобы Слик мог знать, как читать/писать java.util.Date/java.sql.Date. Но у Java 8 теперь есть API для обработки даты/времени/календарей.

implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
    ldt => Timestamp.valueOf(ldt), 
    t => t.toLocalDateTime 
) 

См. Также this вопрос. Кстати, спасибо за чтение моей статьи, надеюсь, что это было полезно! :)