如何使用数组创建anorm的解析器?

Hoa*_*Ong 2 postgresql scala playframework anorm

我正在使用支持数组列字段的postgresql.要解析一行,我使用此解析器.它在Array对象上有错误.我想我做错了.

case class ServiceRequest(
  id: Pk[Long],
  firstname: String,
  lastname: String,
  images: Array[String])

val parser: RowParser[ServiceRequest] = {
    get[Pk[Long]]("id") ~
      get[String]("firstname") ~
      get[String]("lastname") ~
      Error here >>> get[Array[String]]("images") map {
        case id ~ firstname ~ lastname ~ images=>
          ServiceRequest(id, firstname, lastname, images)
      }
  }
Run Code Online (Sandbox Code Playgroud)

谢谢

Zan*_* XY 5

Array[T]类型现在在播放2.4.x中原生支持,您不必滚动自己的转换器.但是,使用插入或更新语句仍然不太好:

def updateTags(id: Long, values: Seq[String]):Int = {
    DB.withConnection { implicit conn =>
      SQL("UPDATE entries SET tags = {value} WHERE id = {id}")
        .on('value -> values, 'id -> id).executeUpdate
} 
Run Code Online (Sandbox Code Playgroud)

会给你一个错误

play - 无法调用该操作,最终出现错误:org.postgresql.util.PSQLException:ERROR:语法错误在"$ 2"或附近

简单地说,你应该创建PreparedStatement使用java.sql.Array类型:

on('value -> conn.createArrayOf("varchar", value.asInstanceOf[Array[AnyRef]]), ...

截至目前(播放2.4-M1),默认情况下java.sql.Array不会转换为ParameterValue,这意味着 SQL(...).on(`arr -> values:java.sql.Array )仍然会产生编译错误,您需要另一个隐式转换来进行编译:

  implicit object sqlArrayToStatement extends ToStatement[java.sql.Array] {
    def set(s: PreparedStatement, i: Int, n: java.sql.Array) = s.setArray(i, n)
  }
Run Code Online (Sandbox Code Playgroud)