我正在使用支持数组列字段的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)
}
}
由于
答案 0 :(得分:5)
现在,在游戏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:错误:语法错误在或附近" $ 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)
}
答案 1 :(得分:4)
我通过添加此转换器解决了我的问题:
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。
答案 2 :(得分:0)
目前有一个pullrequest将java.sql.Array的支持添加为列映射:https://github.com/playframework/playframework/pull/3062。
最佳,