簡體   English   中英

如何使用數組創建anorm的解析器?

[英]How to create anorm's parser with array?

我正在使用支持數組列字段的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)
      }
  }

謝謝

現在,在Play 2.4.x中本機支持Array[T]類型,您不必滾動自己的轉換器。 但是,使用插入或更新語句仍然不太好:

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
} 

會給你一個錯誤

play - 無法調用該操作,最終出現錯誤:org.postgresql.util.PSQLException:ERROR:語法錯誤在“$ 2”或附近

簡而言之,您應該使用java.sql.Array類型創建PreparedStatement

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)
  }

我通過添加此轉換器解決了我的問題:

implicit def rowToStringArray: Column[Array[String]] = Column.nonNull { (value, meta) =>
    val MetaDataItem(qualified, nullable, clazz) = meta
    value match {
      case o: java.sql.Array => Right(o.getArray().asInstanceOf[Array[String]])
      case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass))
    }
  }

轉換器將數據類型從postgresql的jdbc轉換為SELECT函數中解析器的java數據類型。 插入時,需要另一個轉換器將java的數據類型轉換為postgresql的jdbc。

目前有一個pullrequest來添加對java.sql.Array的支持作為列映射: https//github.com/playframework/playframework/pull/3062

最好,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM