如何使用scalikejdbc在具有自定义类型的postgres中保存记录?

时间:2018-10-19 09:19:31

标签: postgresql scala scalikejdbc

就我而言,我在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'), ...)
}

此外,我尝试在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 :(得分:0)

最后,解决了。 我必须添加隐式转换器:

 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
}