在 Spring 中将数组设置为 SqlParameterSource
Set Array as SqlParameterSource in Spring
我想执行下面的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
value supplied for the SQL parameter 'tags': No value registered for
key 'tags'
如果我使用也一样:
Integer[] a = { 2200, 23 };
params.addValue("tags", Arrays.asList(a));
namedParameterJdbcTemplate.queryForObject(statement, params, String.class);
API javadoc 声明您必须
Pass in the values as a java.util.List of primitive objects
http://docs.spring.io/spring/docs/3.1.0.RELEASE/reference/html/jdbc.html#jdbc-in-clause
并且您正在使用数组。您可以使用 Arrays.asList
将数组转换为列表
此外,我认为您需要 NamedParameterJdbcTemplate
而不是该查询的 SimpleJdbcTemplate
。
编辑:
我已经使用这个示例项目来测试解决方案 http://www.tutorialspoint.com/spring/spring_jdbc_example.htm
这是那个例子中使用的table
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
在 class 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
,得到的结果是
我想执行下面的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 value supplied for the SQL parameter 'tags': No value registered for key 'tags'
如果我使用也一样:
Integer[] a = { 2200, 23 };
params.addValue("tags", Arrays.asList(a));
namedParameterJdbcTemplate.queryForObject(statement, params, String.class);
API javadoc 声明您必须
Pass in the values as a java.util.List of primitive objects
http://docs.spring.io/spring/docs/3.1.0.RELEASE/reference/html/jdbc.html#jdbc-in-clause
并且您正在使用数组。您可以使用 Arrays.asList
此外,我认为您需要 NamedParameterJdbcTemplate
而不是该查询的 SimpleJdbcTemplate
。
编辑:
我已经使用这个示例项目来测试解决方案 http://www.tutorialspoint.com/spring/spring_jdbc_example.htm
这是那个例子中使用的table
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
在 class 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
,得到的结果是