将 PgArray 或 java.sql.Array 转换为 Scala 集合

Cast PgArray or java.sql.Array to a Scala collection

我有一个 postgres 查询,它使用 array_agg() 函数来 return 一个 PgArray 值。 运行 这个查询用一个简单的 java.sql.PreparedStatement 我得到一个 java.sql.ResultSet.

val arrayCol = resultSet.getArray("array_agg_column_name")之后我有一个java.sql.Array

打印 arrayCol 看起来像

{1, 2, 3}

调用 arrayCol.getArray 给我一个 Object

我不确定如何在我的 Scala 代码中使用 Object 或 java.sql.Array 类型。做一个简单的 asInstanceOf[List[Int]] 失败

java.lang.ClassCastException: [Ljava.lang.Integer; cannot be cast to scala.collection.immutable.List

而带 asInstanceOf[Array[Int]] 的套管会导致

java.lang.ClassCastException: [Ljava.lang.Integer; cannot be cast to [I

如果我import scala.collection.JavaConverters._

然后尝试使用 asScala 我得到

value asScala is not a member of Object

或“... of java.sql.Array”,取决于我是否调用 getArray

解析由 psql array_agg 函数产生的字段的正确方法是什么?

我能够在 postgres 查询中使用 json_agg 代替 array_agg,然后执行:

resultSet.getString("array_agg_column_name")

在这里,您可以随心所欲。我们使用 Circe 将 Json 解码为 Scala 对象。

您仍然可以将其转换为 Array[AnyRef] 并通过遍历数组将其转换为另一种类型。

val arrayCol = resultSet.getArray("array_agg_column_name")
.getArray().asInstanceOf[Array[AnyRef]]

val ans = arrayCol.map(i => i.asInstanceOf[Int])