Postgresql 如何使用数组创建anorm的解析器?
我正在使用支持数组列字段的postgresql。要解析一行,我使用这个解析器。它在数组对象上有错误。我想我做错了Postgresql 如何使用数组创建anorm的解析器?,postgresql,scala,playframework,anorm,Postgresql,Scala,Playframework,Anorm,我正在使用支持数组列字段的postgresql。要解析一行,我使用这个解析器。它在数组对象上有错误。我想我做错了 case class ServiceRequest( id: Pk[Long], firstname: String, lastname: String, images: Array[String]) val parser: RowParser[ServiceRequest] = { get[Pk[Long]]("id") ~ get[Strin
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)
}
}
谢谢我通过添加此转换器解决了我的问题:
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作为列映射的支持: 最好的是,现在play 2.4.x本机支持阵列[T]类型,您不必使用自己的转换器。 但是,使用insert或update语句仍然不太好,例如:
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
}
会给你一个错误
播放-无法调用操作,最终出现错误:
org.postgresql.util.PSQLException:错误:语法错误位于或接近$2
简单地说,您应该使用java.sql.Array类型创建PreparedStatement:
在'value->conn.createArrayOfvarchar,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)
}
这只是一个猜测,我是scala&anorm的新手,但你试过Seq[String]吗?我试过Seq和List。两者都一样。我刚刚找到了一个为解析器创建自定义提取器的解决方案。你能发布它吗?我相信它会对其他人有帮助,包括但不限于我:当然,我会在完成代码并测试它以确保它正常工作后。Thank.PR在Master上合并,正如您在测试/规格中看到的,该功能包含在最新来源中:真棒!!!!在2.4版本发布之前,我相信它将支持阵列,这是并且将很好地工作!!!!