Приведите PgArray или java.sql.Array к коллекции Scala - PullRequest
2 голосов
/ 08 октября 2019

У меня есть запрос postgres, который использует функцию array_agg() для возврата значений PgArray. Запустив этот запрос с простым java.sql.PreparedStatement, я получаю java.sql.ResultSet.

После val arrayCol = resultSet.getArray("array_agg_column_name") У меня есть java.sql.Array

массив печатиCol выглядит как

{1, 2, 3}

Вызов arrayCol.getArray дает мне Object

Я не уверен, как работать с типами Object или java.sql.Array в моем коде Scala. Выполнение простого 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?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы все еще можете привести его к Array[AnyRef] и преобразовать его в другой тип, просматривая массив.

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

val ans = arrayCol.map(i => i.asInstanceOf[Int])
0 голосов
/ 08 октября 2019

Я смог использовать json_agg вместо array_agg в запросе postgres, а затем выполнить:

resultSet.getString("array_agg_column_name")

Отсюда вы можете делать все, что захотите. Мы используем Circe для декодирования Json в объекты Scala.

...