Как сопоставить List[String] со строкой в ​​Slick 2.0?

Поскольку база данных MySQL не поддерживает массивы, я хочу сопоставить списки строк, таких как List("facebook","linkedin","local"), со строкой, такой как "facebook, linkedin, local".

Я хочу сделать двунаправленное отображение с помощью slick 2.0, но не знаю, как написать экземпляр TypeMapper.

Может ли кто-нибудь привести пример для меня?


person user504909    schedule 23.04.2014    source источник


Ответы (1)


Это описано в официальном документе здесь. .

Вы можете использовать MappedColumnType.base[T, U](tmap: (T) ⇒ U, tcomap: (U) ⇒ T) (см. scaladoc).

Для этого требуются два аргумента функции tmap и tcomap, которые выполняют отображение в обоих направлениях.

Для вашего конкретного случая использования это может быть реализовано следующим образом:

implicit val stringListMapper = MappedColumnType.base[List[String],String](
  list => list.mkString(","),
  string => string.split(',').toList
)

Обратите внимание, что это небезопасно, потому что если в строках есть запятые, отображение не является биективным. Вы должны были бы убедиться, что их нет, или каким-то образом избежать их. Я оставляю это вам.

person Martin Ring    schedule 23.04.2014
comment
это не удается, если список пуст, следующая немного другая альтернатива поддерживает пустые списки: scala MappedColumnType.base[List[String], String]( { case Nil => "" case list => list.mkString(",") }, { case "" => Nil case string => string.split(',').toList } ) - person Jonas Chapuis; 10.03.2020