Подтвердить что ты не робот

Как создать динамический "в (...)" sql-список через Spring JdbcTemplate?

Можно ли генерировать произвольные "in()" списки в запросе SQL через шаблон Jdbc:

Пример:

"выберите * из t, где c in (#)", однако '#' может быть произвольным списком значений, известных только во время выполнения.

4b9b3361

Ответ 1

Да, это возможно в 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.

Ответ 2

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

Ответ 3

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.