在Spring中使用JdbcTemplate如何传递多个值给查询?

4
在我的Spring Hibernate应用程序中,我将所有的SQL查询都放在一个common_queries.xml文件中,其中一些查询需要2到3个参数,如下所示。
   <query id="mining.fuel" no-of-params="2">
select ms.id id,ms.name value,concat(ms.name,' ','  (',ms.code,')') label,ms.rate rate     from mining_fuel ms where ms.name like '?' and ms.fuel_type_id=?  LIMIT 10
 </query>   

在我的 daoImpl 中,我使用了这个查询

lookupList = jdbcTemplate.queryForList(q1.getQuery());

我将在这里获取查询,但如何传递'?'的值,在daoImpl中我有这两个值。请发送代码以实现此操作。我不想使用预编译语句。

3个回答

5
使用 这个重载,它接受一个对象可变参数来传递查询参数:
lookupList = jdbcTemplate.queryForList(q1.getQuery(), value1, value2, value3);

我尝试了一下,有两个值(q1.getQuery(),lookupValue,filterType)。但是当我硬编码lookupValue并且只传递一个参数filterType时,它可以正常工作,但是当我反过来做时,它会抛出java.sql.SQLException: No parameters defined during prepareCall()的异常。当我传递两个值时,它会抛出java.sql.SQLException: Parameter index out of bounds. 2 is not between valid values of 1 and 1的异常。在我上面提到的"like"附近的选择查询是否有问题? - Anupama
1
尝试去掉第一个?周围的引号:like ? - Costi Ciudatu
实际上我想使用(如“?%”),但如果我去掉单引号(如?%),它会显示SQL语法异常。如果我使用带引号的方式,它会显示参数越界异常。 - Anupama
我猜你需要在不使用引号的情况下并将“%”附加到值后使用它:... like ? ...,然后你的值应该是someString + '%' - Costi Ciudatu

4

我认为您只需要创建一个对象数组,并使用查询中使用的参数,要注意顺序很重要,因为value1将是查询中?的第一个替换。

lookupList = jdbcTemplate.queryForList(q1.getQuery(), new Object[]{value1, value2, value3});

0

首先,在jdbctemplate引用上调用queryForList方法,并传递查询和对象类型数组。在这个对象类型数组中,我们必须只传递对象,也就是说,如果我们有一个id,它是int类型,我们必须在放入对象数组时将其转换为对象类型。

lookupList = jdbcTemplate.queryForList(q1.getQuery, new Object[]{designation, new Integer(id), new Float(sal)}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接