Как сохранить запись в postgres с пользовательским типом, используя scalikejdbc? - PullRequest
0 голосов
/ 19 октября 2018

В моем случае у меня есть тип enum в postgres:

create type my_type as enum (string value);

И некоторые таблицы, использующие это как тип столбца:

create table A (
...
t my_type,
...
)

В postgres я могу вставить новую запись втаблица A выглядит следующим образом:

insert into A values(..., 'my_type_value', ...);

Scalikejdbc генерирует правильный sql:

 insert into A (...) values (..., 'my_type_value', ...)

Но происходит сбой с ошибкой:

ОШИБКА: столбец "t" равентипа my_type, но выражение имеет различный символьный тип. СОВЕТ: Вам нужно будет переписать или привести выражение.

Я пытался сделать это:

object MyType extends Enumeration {...}
case class A(..., t: MyType, ...)
object A extends SQLSyntaxSupport[A] {
  def apply(rs: WrappedResultSet): A = A(..., rs.getString('t'), ...)
}

Также я пыталсядобавить неявные преобразования в enum-тип в scala-коде:

object MyType extends Enumeration {
   implicit def stringToValue...
   implicit def valueToString ...
}

Но это тоже не помогло.

Вставьте код выглядит следующим образом:

 withSQL {
      insertInto(A).namedValues(
        ...
        A.column.t-> e.t, // e - passed entity into insert fun
        ....
      )
    }.update().apply()

1 Ответ

0 голосов
/ 19 октября 2018

Наконец-то решил.Я должен добавить неявный конвертер:

 implicit val valueToParameterBinder: ParameterBinderFactory[MyType] = ParameterBinderFactory {
    value => (stmt, indx) => stmt.setObject(indx, value, Types.OTHER)
  }

object A extends SQLSyntaxSupport[A] {
  def apply(rs: WrappedResultSet): A = A(..., rs.getString('t'), ...) // just call getString as usual
}
...