[英]PostgreSQL numeric type and anorm parser with Play! scala 2.3
[英]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.