Параметризованный запрос: проверьте, находится ли поле в массиве значений в инструкции SELECT - PullRequest
3 голосов
/ 01 ноября 2009

Я пытаюсь настроить параметризованный запрос на результат:

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 })

В дополнение к этому, ресурсы, которые описывают, как параметризовать запросы, также будут очень полезны.

Все эти запросы генерируют исключения PSQLExx, которые указывают на сбой оператора или на несоответствие типов - что кажется разумным, поскольку я не могу понять, как параметризовать запрос.

Ответы [ 2 ]

5 голосов
/ 01 ноября 2009

Взгляните на веб-страницу 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());
2 голосов
/ 01 ноября 2009

Я еще раз взглянул на руководство, похоже, что поиск в массивах есть альтернативный синтаксис, что-то вроде:

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}" })
...