Сопоставитель типов клиентов для Slick SQL

Я нашел этот пример из гладкого тестирования:
https://github.com/slick/slick/blob/master/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/MapperTest.scala

sealed trait Bool
case object True extends Bool
case object False extends Bool

implicit val boolTypeMapper = MappedColumnType.base[Bool, String](
  { b =>
    assertNotNull(b)
    if(b == True) "y" else "n"
  }, { i =>
    assertNotNull(i)
    if(i == "y") True else False
  }
)

Но я пытаюсь создать TypeMapper для org.joda.time.DateTime в/из java.sql.Timestamp, но без особого успеха. Пример Bool очень специфичен, и у меня возникли проблемы с его адаптацией. Joda Time очень распространен, поэтому любая помощь будет высоко оценена.

Чтобы было ясно, я использую интерполированный sql"""выберите colA,colB из таблицыA, где id = ${id}""" и т.д. При выполнении выбора система работает хорошо, используя типы jodaDate в неявном преобразователе GetResult.

Однако для вставок, похоже, нет способа выполнить неявное преобразование, или он игнорирует код, представленный ниже в ответе № 1 - та же ошибка, что и раньше: не удалось найти неявное значение для параметра pconv: scala.slick.jdbc .SetParameter[(Option[Int], String, String, Option[org.joda.time.DateTime])]

Я не использую конфигурацию Slick в стиле Lifted с аннотированными объектами Table, возможно, поэтому он не находит/не использует TypeMapper


person malsmith    schedule 11.02.2013    source источник


Ответы (2)


Я использую в своем коде следующее, что также может сработать для вас:

import java.sql.Timestamp
import org.joda.time.DateTime
import org.joda.time.DateTimeZone.UTC
import scala.slick.lifted.MappedTypeMapper.base
import scala.slick.lifted.TypeMapper

implicit val DateTimeMapper: TypeMapper[DateTime] = 
  base[DateTime, Timestamp](
    d => new Timestamp(d millis), 
    t => new DateTime(t getTime, UTC))

Редактировать (после вашего редактирования =^.~= ): (немного поздно, но я надеюсь, что это все еще помогает)

Ах, хорошо, поскольку вы не используете поднятое встраивание, вам придется определить другие неявные значения (как указано в сообщении об ошибке от компилятора). Что-то вроде следующего должно работать (хотя я сам не пробовал):

implicit val SetDateTime: SetParameter[DateTime] = new SetParameter { 
  def apply(d: DateTime, p: PositionedParameters): Unit =
    p setTimestamp (new Timestamp(d millis))
}

В противном случае (получение результатов SELECT) похоже, что вам нужно определить GetResult:

implicit val GetDateTime: GetResult[DateTime] = new GetResult {
  def apply(r: PositionedResult) = new DateTime(r.nextTimestamp getTime, UTC))
}

Итак, в основном это то же самое, что и с поднятым встраиванием, просто закодированное с другими типами.

person Community    schedule 11.02.2013
comment
Спасибо за этот пример, я использовал MappedTypeMapped, и это вызывало ошибки, но этот пример с четким определением типа для преобразования работает как шарм. - person Krzysztof Kowalski; 23.09.2013

Почему бы не заняться чем-то, что отлично работает? смотреть на

https://gist.github.com/dragisak/4756344

а также

https://github.com/tototoshi/slick-joda-mapper

Первый вы можете скопировать и вставить в свой проект, а второй доступен в центре Maven.

person Alex Povar    schedule 24.06.2013
comment
Я пытаюсь использовать (1), но MappedColumnType def Birthday = column[JDATE](BIRTHDAY) я получаю следующую ошибку. Недостаточно аргументов для столбца метода (неявный tm: scala.slick.ast.TypedType[JDATE]) scala.slick.lifted.Column[JDATE]. Параметр неопределенного значения tm. Но где мне передать тм? - person Andy; 18.10.2014