Jdbc 在Prepared语句中传递动态值

Jdbc 在Prepared语句中传递动态值,jdbc,clojure,Jdbc,Clojure,我正在使用Clojure.java.jdbc访问Clojure中的数据库。 我想在select中使用准备好的语句 从我之前的问题我得到了这样的答案 (jdbc/query(:conn dbinfo) [“从用户名=?和密码=?”的用户中选择*” “harikk09” “amma123”]) 它也在起作用 现在, 这个参数列表是我想动态设置的。所以我写了一个函数,比如 (定义值生成器(fn[param](:value@(:value(param 1)())))) 它实际上工作正常,并使用pri

我正在使用Clojure.java.jdbc访问Clojure中的数据库。 我想在select中使用准备好的语句

从我之前的问题我得到了这样的答案

(jdbc/query(:conn dbinfo)
[“从用户名=?和密码=?”的用户中选择*”
“harikk09”
“amma123”])
它也在起作用

现在,

这个参数列表是我想动态设置的。所以我写了一个函数,比如

(定义值生成器(fn[param](:value@(:value(param 1)()))))
它实际上工作正常,并使用println返回值的集合

(println(映射值生成器参数))
给予

(harikk09 amma123)
但当我尝试这样执行它时,其中sql查询就是前面提到的查询

(jdbc/query(:conn dbinfo)sql查询(映射值生成器参数))
,它会引发一个异常:

Caused by: java.lang.IllegalArgumentException: No value supplied for key: 
Clojure.lang.LazySeq@ab5111fa
有人能帮我纠正这个错误吗


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

在参数中使用apply-to-splice

(apply jdbc/query (:conn dbinfo) sql-query (map values-builder params))
更新:如下所述,apply不起作用,因为sql需要位于带有参数的向量中 在这种情况下,您需要将sql查询限制到生成的参数列表上

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

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

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

谢谢你的回复。我尝试了它,得到了一个异常:由以下原因引起:java.sql.SQLException:如果要将所有参数的集合作为单独的参数应用于函数,则不使用为参数1apply指定的值。在这里,他需要将集合的项添加到第二个参数中,该参数应该是字符串和准备好的值的集合。因此,partial和apply的组合都不能实现这一点。