我可以请求JDBCTemplate扩展list参数以用于in()子句吗?

时间:2010-08-31 23:10:15

标签: java spring jdbc spring-jdbc

我可以这样做:

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类。

4 个答案:

答案 0 :(得分:26)

您可以使用NamedParameterJdbcTemplate。

来完成

对于你的样本,它会像:

NamedParameterJdbcTemplate db = ...;
List paramList = ...;

Map idsMap = Collections.singletonMap("ids", paramList);
db.query("select * from mytable m where m.group_id in (:ids)", idsMap);

答案 1 :(得分:5)

抱歉,不能那样做。你可以自己写一个方便的方法,但据我所知,没有像{Hibernate这样的setParameterList()

答案 2 :(得分:2)

请找到以下代码

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;

    }

答案 3 :(得分:0)

是的,您可以在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);