Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring jdbctemplate-如何将列表(包含多个参数)绑定到查询参数中_Spring_Jdbctemplate - Fatal编程技术网

spring jdbctemplate-如何将列表(包含多个参数)绑定到查询参数中

spring jdbctemplate-如何将列表(包含多个参数)绑定到查询参数中,spring,jdbctemplate,Spring,Jdbctemplate,我想知道如何将对象列表绑定到带有“where”子句中1个以上参数的sql中 Select * from order where order_id = ? and action_code = ? 数据就像 List<Order> orderList = new ArrayList<>(); orderList.add(1,"KP"); orderList.add(2,"DP"); orderList.add(3,"KP"); 我将按如下方式发出查询 jdbcTempla

我想知道如何将对象列表绑定到带有“where”子句中1个以上参数的sql中

Select * from order where order_id = ? and action_code = ?
数据就像

List<Order> orderList = new ArrayList<>();
orderList.add(1,"KP");
orderList.add(2,"DP");
orderList.add(3,"KP");
我将按如下方式发出查询

jdbcTemplate.query(sql, args, rowMapper);
当我运行应用程序时,我得到以下错误

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT * where ORD_I = ? AND ACT_C = ?]; SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type
但是,如果我按下面的方式传递数据,它就会工作

jdbcTemplate.query(sql, new Object[] {orderList.get(0).getOrderId, orderList.get(0).getActionCode()}, rowMapper);
到目前为止我都试过了 我提供的类型如下[在DB中,订单id为数字(38),操作代码为字符(2))

我得到一个异常,它是这样说的。[当我用java.sql.Types.VARCHAR替换java.sql.Types.CHAR时出现了相同的错误]

org.springframework.dao.InvalidDataAccessApiUsageException: args and argTypes parameters must match
下面的设置工作

 int[] types = new int[] { java.sql.Types.NUMERIC, java.sql.Types.CHAR 
    };
jdbcTemplate.query(sql, new Object[] {orderList.get(0).getOrderId, orderList.get(0).getActionCode()}, types, rowMapper);
我已提及以下问题 -讨论从列表中传递一个参数

-谈论元组。如果我必须查询两个表,其中tableA.id=tableB.id,tableA.id=?和tableB.seq_id=?,那么上述解决方案不起作用


我在谷歌上搜索了很多次,但现在遇到了一个障碍。请帮忙。

我知道这个解决方案不适用于列表,但我建议使用它,而不是常规的jdbcTemplate。它更简单,而且改动相对较小:

SQL:

orderIDactionCode对应于参数HashMap中的字符串键值(如下所示)

爪哇:

这里,
set
orderID
actionCode
参数的组合,
parameterset
是所有组合(集合)要查询的
orderID
actionCode
otherMap
是您创建的一些映射集合,用于将数据保存在for循环之外,使用第一组和第二组参数的concat作为键,结果集作为值

编辑后续评论:

如果您有1000个唯一的对,那么这意味着这些唯一的对参数中的每一个都应该返回不同的、互斥的结果集。例如,在WHERE条件中输入参数A和B应该返回与输入参数A和C不同的结果集。我看不到这方面的快捷方式。您本质上是在问1000个不同的问题,每个问题都有不同的答案。确保获得所有结果集并只执行一个查询的唯一方法是输入第一个参数和第二个参数的所有可能值:

WHERE parameter1 IN (... all possible values for parameter1) AND
parameter2 IN (... all possible values for parameter2)

但是,这将产生比您想要的多得多的行。然后您必须以编程方式应用您自己的逻辑,以筛选出不属于唯一参数组合集的结果集。

我知道此解决方案不适用于列表,但我建议使用,而不是常规的jdbcTemplate。这比这是一个简单且相对较小的变化:

SQL:

orderIDactionCode对应于参数HashMap中的字符串键值(如下所示)

爪哇:

这里,
set
orderID
actionCode
参数的组合,
parameterset
是所有组合(集合)要查询的
orderID
actionCode
otherMap
是您创建的一些映射集合,用于将数据保存在for循环之外,使用第一组和第二组参数的concat作为键,结果集作为值

编辑后续评论:

如果您有1000个唯一的对,那么这意味着这些唯一的对参数中的每一个都应该返回不同的、互斥的结果集。例如,在WHERE条件中输入参数A和B应该返回与输入参数A和C不同的结果集。我看不到这方面的快捷方式。您本质上是在问1000个不同的问题,每个问题都有不同的答案。确保获得所有结果集并只执行一个查询的唯一方法是输入第一个参数和第二个参数的所有可能值:

WHERE parameter1 IN (... all possible values for parameter1) AND
parameter2 IN (... all possible values for parameter2)

但是,这将产生比您想要的多得多的行。然后您必须以编程方式应用您自己的逻辑,以筛选出不属于唯一参数组合集的结果集。

很抱歉响应太晚…无法工作!!!!但是作为键“orderId”或“actionCode”保持不变,数据会在for循环期间被覆盖。如何进行此操作?检查我编辑的响应,我试图提出一个解决方案。如果我有1000个orderid acioncode对,那么使用此方法,我需要触发1000个select查询。这对性能有很大的影响。spring jdbc模板是否有任何功能来适应此场景或m我在这里漏掉了一些东西。“帮助很深。”YoGrDRAN给我的答案添加了一个编辑。简而言之,我认为这是不可能的。有可能获得更广泛的结果集,然后以编程方式进行过滤。此外,考虑执行查询的成本,而不是建立连接。e、 很抱歉,回复太晚…不在工作!!!!但是作为密钥“orderId”或“actionCode”保持不变,数据会在for循环期间被覆盖。如何进行此操作?检查我编辑的响应,我试图提出一个解决方案。如果我有1000个orderid acioncode对,那么使用此方法,我需要触发1000个select查询。这对性能有很大的影响。spring jdbc模板是否有任何功能来适应此场景或m我在这里漏掉了一些东西。“帮助很深。”YoGrDRAN给我的答案添加了一个编辑。简而言之,我认为这是不可能的。有可能获得更广泛的结果集,然后以编程方式进行过滤。此外,考虑执行查询的成本,而不是建立连接。E
Select * from order where order_id = :orderId and action_code = :actionCode
Map<String, Object> parameters = new HashMap<>();
parameters.put("orderID","KP");
parameters.put("actionCode","DP");

namedParameterJdbcTemplate.execute(sqlQueryString, parameters);
for (set in parameterSet){
parameters.put(set1, set2); 
ResultSet rs = jdbcTemplate.execute(queryString, parameters); 
otherMap.put(set1 + set2, rs);}
WHERE parameter1 IN (... all possible values for parameter1) AND
parameter2 IN (... all possible values for parameter2)