我可以做这样的事情:
select * from mytable m where m.group_id in (?)
...并传入要扩展为我的参数的参数列表或数组,即:
select * from mytable m where m.group_id in (1,2,3,4)
具体来说,我正在使用 Spring 和 JdbcTemplate/SimpleJdbcTemplate 类。
我可以做这样的事情:
select * from mytable m where m.group_id in (?)
...并传入要扩展为我的参数的参数列表或数组,即:
select * from mytable m where m.group_id in (1,2,3,4)
具体来说,我正在使用 Spring 和 JdbcTemplate/SimpleJdbcTemplate 类。
您可以使用 NamedParameterJdbcTemplate 来完成。
使用您的样本,它将类似于:
NamedParameterJdbcTemplate db = ...;
List paramList = ...;
Map idsMap = Collections.singletonMap("ids", paramList);
db.query("select * from mytable m where m.group_id in (:ids)", idsMap);
对不起,不能那样做。您可以为自己编写一个方便的方法来做到这一点,但据我所知,没有setParameterList()
像 Hibernate 这样的方法。
请找到以下代码
public Collection<Employee> findByIds(List<String> ids) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("ids", ids);
List<Employee> employees = namedParameterJdbcTemplate.query(
"SELECT * FROM trn_employee where employee_id IN (:ids)",
params,
ParameterizedBeanPropertyRowMapper.newInstance(Employee.class));
return employees;
}
是的,您可以在 Spring 3 中使用命名参数。
见http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-in-clause
它应该采用任何原语列表并扩展列表。请注意,您的列表不会超过数据库支持的最大大小。(Oracle 限制为 1000)。像这样的东西应该工作:
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(3);
Map<String,Object> params = new HashMap<String, Object>();
String sql = "SELECT PERSON.ID, PERSON.USERNAME, PERSON.EMAIL_ADDRESS, PERSON.FIRST_NAME, PERSON.LAST_NAME, PERSON.ACCOUNT_STATUS FROM PERSON WHERE ID IN (:ids)";
params.put("ids",ids);
return getSimpleJdbcTemplate().query(sql, rowMapper, params);