我正在尝试将参数化查询配置为以下效果:
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,指示操作符失败或存在类型不匹配 - 这似乎是合理的,因为我无法弄清楚如何参数化查询。
答案 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}" })