2009-11-01 16 views
3

我想配置参数化查询到的效果:参数化查询:检查是否领域是在SELECT语句中值的阵列

SELECT field1 FROM myTable WHERE field2 IN (1,2,3,4) 

我正在使用的数据库是Postgres的。

这个查询运行成功unparameterized,但我想使用带有JdbcTemplate的参数化查询来填充有效的field2值(这是整数)的列表。

尝试各种值var"1,2,3,4""[1,2,3,4]""{1,2,3,4}",或"(1,2,3,4)")我试图对查询变化:

myJdbcTemplate.query("SELECT field1 FROM field2 IN (?)", new Object[]{ var }) 

myJdbcTemplate.query("SELECT field1 FROM field2 IN (?::integer[])", new Object[]{ var }) 

并且还

myJdbcTemplate.query("SELECT field1 FROM field2 IN ?::integer[]", new Object[]{ var }) 

开一个侧面说明,描述如何参数化查询的资源也是非常有用的。

所有这些查询都抛出PSQLExceptions,表明操作失败或者存在类型不匹配 - 这看起来很合理,因为我无法弄清楚如何参数化查询。

回答

5

看看的春季Data Access web page,特别是章节11.7.3,其中使用NamedParameterJdbcTemplate构建'IN'条款。

例如

NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); 
String sql = "select * from emp where empno in (:ids)"; 
List idList = new ArrayList(2); 
idList.add(new Long(7782)); 
idList.add(new Long(7788)); 
Map parameters = new HashMap(); 
parameters.put("ids", idList); 
List emps = jdbcTemplate.query(sql, parameters, new EmpMapper()); 
+0

谢谢 - 这正是我所期待的。 – 2009-11-01 17:48:38

2

我又看看说明书,它看起来像search arrays有一个替代语法,是这样的:

SELECT field1 FROM myTable WHERE field2 = ANY(ARRAY[1,2,3,4]) 

可参数为:

myJdbcTemplate.query("SELECT field1 FROM myTable WHERE field2 = ANY(?::integer[])"), new Object[]{ "{1,2,3,4}" })