在Prepared Statement中传递的动态值

时间:2014-02-28 05:55:49

标签: jdbc clojure

我在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-query是前面提到的查询

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

,它引发了一个例外:

Caused by: java.lang.IllegalArgumentException: No value supplied for key: 
Clojure.lang.LazySeq@ab5111fa

有人可以帮我纠正这个错误吗?

我认为clojure需要一个没有()或[]的参数列表。

2 个答案:

答案 0 :(得分:1)

JDBC查询和准备好的值一起需要是一个集合。因此,您需要从字符串和参数化值集合中创建集合。要将单个项目添加到集合的前面,请使用cons

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

答案 1 :(得分:0)

使用apply to splice in arguments

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

更新:如下所述,适用不起作用,因为sql需要在带有参数的向量中 在这种情况下,您需要将sql查询包含在生成的参数列表

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