在Spring中将Array设置为SqlParameterSource

时间:2016-05-04 04:42:53

标签: java spring spring-jdbc

我想执行以下select语句

SELECT array_to_json(array_agg(row_to_json(opt)))
FROM (
    SELECT * FROM option WHERE optionid IN (:tags)
)opt

经由

MapSqlParameterSource params = new MapSqlParameterSource();
Integer[] a={2200,23};
params.addValue("tags", Arrays.asList(a));
getSimpleJdbcTemplate().queryForObject(statement, String.class, params);

但我总是遇到错误:

  

class org.springframework.dao.InvalidDataAccessApiUsageException No   为SQL参数提供的值'标记':没有注册的值   key'标签'

如果我使用相同:

Integer[] a = { 2200, 23 };
params.addValue("tags", Arrays.asList(a));
namedParameterJdbcTemplate.queryForObject(statement, params, String.class);

1 个答案:

答案 0 :(得分:4)

API javadoc声明您必须

  

将值作为原始对象的java.util.List传递

http://docs.spring.io/spring/docs/3.1.0.RELEASE/reference/html/jdbc.html#jdbc-in-clause

你正在使用一个数组。您可以使用Arrays.asList

将数组转换为List

另外,我认为您需要NamedParameterJdbcTemplate代替SimpleJdbcTemplate该查询。

<强> EDITED

我已使用此示例项目来测试解决方案http://www.tutorialspoint.com/spring/spring_jdbc_example.htm

这是该示例中使用的表

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);

这些是插入数据库

的记录
------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 11
ID : 2, Name : Nuha, Age : 2
ID : 3, Name : Ayan, Age : 15

在课程StudentJDBCTemplate中,我实例化了NamedParameterJdbcTemplate并在新方法中使用了它listStudentsNames

   public void setDataSource(DataSource dataSource) {
       this.dataSource = dataSource;
       this.jdbcTemplateObject = new JdbcTemplate(dataSource);
       this.namedJdbcTemplateObject = new NamedParameterJdbcTemplate(dataSource);
   }

   public List<String> listStudentsNames() {
       String SQL = "select name from Student where id IN (:tags)";

       Integer[] intArray = {1, 2, 3};
       List<Integer> intList = Arrays.asList(intArray);

       MapSqlParameterSource params = new MapSqlParameterSource();
       params.addValue("tags", intList);

       return namedJdbcTemplateObject.queryForList(SQL, params, String.class);

    }

我还更改了MainApp以调用该新方法并编写获得的结果

public class MainApp {
     public static void main(String[] args) {
         ApplicationContext context =
         new ClassPathXmlApplicationContext("Beans.xml");

         StudentJDBCTemplate studentJDBCTemplate =
  (StudentJDBCTemplate) context.getBean("studentJDBCTemplate");

         System.out.println("------Listing Multiple Records--------" );
         List<String> studentsName = studentJDBCTemplate.listStudentsNames();
         for (String name : studentsName) {
              System.out.println("Name : " + name);
         }

     }
 }

如果您运行MainApp,则获得的结果为

enter image description here