参数化查询:检查字段是否在SELECT语句中的值数组中

时间:2009-11-01 16:39:51

标签: java sql postgresql jdbc parameterized

我正在尝试将参数化查询配置为以下效果:

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

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

此查询成功运行未参数化,但我想使用带有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,指示操作符失败或存在类型不匹配 - 这似乎是合理的,因为我无法弄清楚如何参数化查询。

2 个答案:

答案 0 :(得分:5)

查看Spring Data Access web page,特别是11.7.3部分,其中使用NamedParameterJdbcTemplate来构建“IN”子句。

e.g。

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());

答案 1 :(得分: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}" })