Можно ли генерировать произвольные "in()" списки в запросе SQL через шаблон Jdbc:
Пример:
"выберите * из t, где c in (#)", однако '#' может быть произвольным списком значений, известных только во время выполнения.
Можно ли генерировать произвольные "in()" списки в запросе SQL через шаблон Jdbc:
Пример:
"выберите * из t, где c in (#)", однако '#' может быть произвольным списком значений, известных только во время выполнения.
Да, это возможно в Spring, если вы используете NamedParameterJdbcTemplate
или SimpleJdbcTemplate
с именованными параметрами. Параметр List может быть установлен как java.util.List
:
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
List<SomeObject> result = simpleJdbcTemplate.query("SELECT * FROM t WHERE c in (:list)",
new RowMapper<SomeObject>() { ... },
Collections.singletonMap("list", list));
В этом случае Spring внутренне создает SQL-запрос с требуемым количеством заполнителей на основе размера фактического списка при замене именованных параметров ?
s.
В Hibernate вы можете использовать следующий образец:
if(tenors != null && tenors.length >0)
sql.append(" and ip.tenor_id in (:tenors)");
.....
if(tenors != null && tenors.length >0){
query.setParameterList("tenors", tenors);
}
.....
SQLQuery query = (SQLQuery) getSession().createSQLQuery(sql.toString())
SimpleJDBCTemplate is depricated now. You can use NamedParameterJdbcTemplate instead.
Ниже приведен пример кода.
Если у вас есть несколько параметров разного типа, вы можете
используйте Object
в качестве ключа, в противном случае используйте List<T>
String sqlAllEmpl = queryLoader.getProperty("allEmployeesByLevelAndPeriod");
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("level", levelStr);
paramMap.put("periodList", periodList);
gridList = namedParameterJdbcTemplate.query(sqlAllEmpl, paramMap, new YourRowMapper());
у вашего sqlAllEmpl будут два держателя места, level
- строка и periodList
- это список, используемый в инструкции IN sql.