res будет привязан к последовательности Clojure на основе ResultSet, где каждый элемент является картой записи результата с именами выходных столбцов в качестве ключевых слов в ключах. Вы не можете добраться до основного фактического объекта ResultSet.
Обычно вы вообще не звоните дальше. Чтобы быть идиоматическим Clojure, вы должны использовать обширную библиотеку функций, которые работают с последовательностями (map, filter, Reduce и т. Д.), Чтобы получить ваш вывод. Здесь вы можете сказать что-то вроде:
(with-query-results res ["SELECT guid from users WHERE email=?" email]
(map :guid res))
, которое применимо: guid как функция над последовательностью и извлекает значение столбца guid в каждой записи, возвращая вам новую последовательность всех направляющих. Затем вы можете обернуть эту карту в фильтр или что-то еще, что вам нужно.
В этом случае seq
должно быть тем, что вы хотите, но я думаю, что абстракция немного просачивается. Когда я попробовал это, я получил java.sql.SQLRecoverableException: Closed Resultset: next , что подразумевает, что ResultSet закрывается слишком рано в абстракции. Тем не менее, я обнаружил, что empty?
работает нормально для этого варианта использования.
(defn user-exists? [email]
(with-connection db
(with-query-results res ["SELECT guid from users WHERE email=?" email]
(.next res)
(not (empty? res)))))
Мне это кажется ошибкой в clojure.core / resultset-seq, и я сообщил об этом здесь как CLJ-676 .