Как привести экземпляр класса Java к Object [] в Clojure - PullRequest
0 голосов
/ 07 марта 2019

Я использую библиотеку JDBC, которая реализует свой собственный класс Array. Для работы с указанным массивом они приводят его к объекту [].

https://github.com/housepower/ClickHouse-Native-JDBC/blob/master/src/test/java/com/github/housepower/jdbc/QueryComplexTypeITest.java#L120

Я использую Clojure и не могу понять, как привести этот класс к массиву Java.

(vec (.getArray results "array-row"))
Unable to convert: class com.github.housepower.jdbc.ClickHouseArray to Object[]

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Полагаю, вы можете попытаться повторить этот массив и составить результат вручную:

(let [array (.getArray results "array-row")]
  (for [item array]
    (turn-item-into-a-map item)))

или, может быть, просто

(mapv turn-item-into-a-map jdbc-array)

Если вы не хотите конвертировать предметы, используйте функцию identity.

Даже если такой массив не поддерживает итерацию, вы все равно можете сделать это, получая доступ к его элементам по индексу в loop / recur:

(let [array (get-jdbc-array...)
      size (.count array)]
  (loop [i 0
         result []]
    (if (= i size)
      result
      (let [item (.get array i)]
        (recur (inc i) (conj result item))))))
0 голосов
/ 07 марта 2019

Разве этот код Java не вызывает метод .getArray и приводит результаты к массиву Object[], а не наоборот? Глядя на источник com.github.housepower.jdbc.ClickHouseArray, кажется, что он расширяет java.sql.Array через com.github.housepower.jdbc.wrapper.SQLArray, который не является Object[]. Верно?

Clojure просто сделает отражение во время выполнения, чтобы разрешить метод объекта, поэтому вам не нужно беспокоиться о приведении. Там может быть больше информации в исключении, которое вы получаете? Попробуйте использовать *e, чтобы получить последнее исключение в REPL. Если бы вы могли опубликовать более полный тестовый пример, мы могли бы получить лучшее представление о проблеме?

...