Clojure contrib sql делает все числа BigDecimal - PullRequest
2 голосов
/ 15 сентября 2010

Библиотека clojure.contrib.sql возвращает BigDecimals для всех числовых полей. Какой хороший способ иметь некоторые поля в виде целых чисел? Пример кода ниже:

(sql/with-connection my-db 
   (sql/with-query-results res 
      [sql-str 6722] 
      (into [] res)))

В полученном наборе записей все числа являются BigDecimal. Некоторые из них являются внешними ключами, и по моим собственным причинам они должны быть целочисленными.

Я знаю, что могу перебрать коллекцию и преобразовать ее, но я бы не стал этого делать, поскольку это очень большая коллекция, и кажется правильным, чтобы библиотека использовала ResultsSet.getInteger, если число помещается в целое число.

БД - это Oracle, а целочисленные поля БД определены как NUMBER (10)

Спасибо

1 Ответ

3 голосов
/ 16 сентября 2010

Как отметил Атрей, целое число из 10 цифр не обязательно будет вписываться в Integer.

Что еще более важно, последовательность, которую вам дают, создается clojure.core/resultset-seq, который в свою очередь вызывает ResultSet.getObject (INT) .В соответствии со спецификацией JDBC, BigDecimals возвращаются, потому что это тип Java, соответствующий типу столбца SQL.

Кроме того, вам не нужно беспокоиться о «повторении» над коллекцией».Результат-seq является ленивым, а map - ленивым, так что вы просто преобразуете каждое число прямо перед тем, как их использовать.Например,

(sql/with-connection my-db 
   (sql/with-query-results res 
      [sql-str 6722] 
      (do-stuff 
         (map (comp int :id) res))))
...