2010-09-15 5 views
2

La bibliothèque clojure.contrib.sql renvoie BigDecimals pour tous les champs numériques. Quel est le meilleur moyen d'avoir des champs en tant que nombres entiers? Exemple de code ci-dessous:Clojure contrib sql transforme tous les nombres en BigDecimal

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

Dans la collection d'enregistrements résultante, tous les nombres sont BigDecimal. Certains d'entre eux sont des clés étrangères, et pour des raisons qui me sont propres, j'ai besoin qu'ils soient entiers.

Je sais que je peux itérer sur la collection et les convertir, mais je préfère ne pas le faire car il s'agit d'une très grande collection, et il semble correct d'utiliser la bibliothèque ResultsSet.getInteger si le nombre correspond à un entier .

Le DB est Oracle, et les champs entiers sont définis DB sous le numéro (10)

Merci

+0

peut-être je n'attraper quelque chose, mais être 2147483647 la limite d'un nombre entier en Java, un nombre de 10 chiffres doit être un long ou un BigDecimal – jneira

+0

Ouais, désolé aurait dû depuis longtemps .... – George

Répondre

3

Comme Atreyu a noté un nombre entier à 10 chiffres correspondent pas nécessairement dans un Integer. Plus important encore, le seq que vous êtes donné est créé par clojure.core/resultset-seq, qui à son tour appelle ResultSet.getObject(int). Selon la spécification JDBC, les BigDecimals sont renvoyées car c'est le type Java qui correspond au type SQL de la colonne.

De plus, vous n'avez pas besoin de vous soucier de "parcourir" la collection ". Le resultset-seq est paresseux, et map est paresseux, donc vous finirez par convertir chaque nombre juste avant de les consommer. Par exemple,

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