2014-02-28 17 views
0

我在Clojure中使用Clojure.java.jdbc進行數據庫訪問。 我想用select語句來準備語句。準備好的聲明中傳遞的動態值

從我剛纔的問題我得到了這樣的答案,

(jdbc/query (:conn dbinfo) 
      ["select * from users where username = ? and password = ?" 
      "harikk09" 
      "amma123"]) 

這也是工作。

現在,

此參數列表我想使動態。所以我寫了一個函數,如

(defn values-builder (fn[param] (:value @(:value (param 1))))) 

它實際上工作正常,並返回使用println值的集合。

(println (map values-builder params)) 

(harikk09 amma123) 

但是,當我試圖像這樣,在SQL查詢就是前面提到的查詢

(jdbc/query (:conn dbinfo) sql-query (map values-builder params)) 

執行它,它拋出一個異常:

Caused by: java.lang.IllegalArgumentException: No value supplied for key: 
[email protected] 

任何人都可以幫助m e糾正這個錯誤?

我認爲clojure期望沒有()或[]的參數列表。

回答

1

JDBC查詢和準備值一起需要是一個集合。所以你需要從一個字符串和一組參數化值中創建一個集合。要將單個項目添加到集合的正面,請使用cons

(jdbc/query (:conn dbinfo) (cons sql-query (map values-builder params))) 
0

使用適用的參數拼接

(apply jdbc/query (:conn dbinfo) sql-query (map values-builder params)) 

更新:下面提到的適用,因爲SQL語句需要與在這種情況下,PARAMS 一個矢量,你需要利弊SQL查詢將無法正常工作生成的參數列表上

(jdbc/query (:conn dbinfo) (cons sql-query (map values-builder params))) 
+0

感謝您的回覆。我試過了,得到一個異常: 引起:java.sql.SQLException:如果你想將所有參數的集合作爲單獨的參數應用到一個函數,那麼沒有爲參數1 – Harikrishnan

+1

apply指定值。在這裏他需要將一個集合的項目添加到第二個參數中,該參數應該是字符串和準備值的集合。所以沒有部分和適用的組合將使這項工作。 – NielsK