3

我正在尝试将参数化查询配置为:

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}", or )的各种值"(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,表明运算符失败或存在类型不匹配——这似乎是合理的,因为我不知道如何参数化查询。

4

2 回答 2

5

查看 Spring Data Access 网页,特别是第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());
于 2009-11-01T17:19:37.880 回答
2

我又看了一下手册,看起来搜索数组有另一种语法,比如:

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}" })
于 2009-11-01T17:05:32.560 回答