如何在JDBCTemplate中使用SELECT IN子句?

时间:2010-12-21 22:36:00

标签: jdbctemplate

这是我第一次使用JDBCTemplates,我遇到了一个需要使用如下查询的情况:

SELECT * FROM table WHERE field IN (?)

我该怎么做?我已经尝试传递一个列表/数组值但是没有做到这一点,我得到了一个异常。我目前的代码如下:

Long id = getJdbcTemplate().queryForLong(query, new Object[]{fieldIds});

Spring Documentation表示除了生成所需数量的“?”之外没有办法做到这一点。占位符以匹配参数List的大小。有解决方法吗?

4 个答案:

答案 0 :(得分:47)

使用NamedParameterJdbcTemplate代替SimpleJdbcDaoSupport进行漫游,您可以执行以下操作:

List integerList = Arrays.asList(new Integer[] {1, 2, 3});
Map<String,Object> params = Collections.singletonMap("fields", integerList);    
Long id = namedParameterJdbcTemplate.queryForLong("SELECT * FROM table WHERE field IN (:fields)", params);

但是,这可能会对您在列表中传递的参数数量产生灾难性的限制,这取决于您使用的数据库。

希望这有用......

答案 1 :(得分:3)

我认为你不能做到这一点'?'。它与Spring JDBC模板无关,它是核心SQL。

你必须为你需要的东西建立一个(?,?,?)。

答案 2 :(得分:2)

对于长列表(例如,Oracle有1000个项目的限制),您可以将其分隔为更多选择:

List<Long> listIds = Arrays.asList(1L, 2L, ..... , 10000L); // list with ids

String query = "select NOTE from NOTE where ID in (:listIds)";

List<String> noteListResult = new ArrayList<>();

int current = 0;
int iter = 100;

while (current < listIds.size()) {
    Map<String, List<Long>> noteIdsMap = Collections.singletonMap("listIds",
            listIds.subList(current, (current + iter > listIds.size()) ? listIds.size() : current + iter));

    List<String> noteListIter = namedParameterJdbcTemplate.queryForList(query, noteIdsMap, String.class);
    noteListResult.addAll(noteListIter);

    current += iter;
}

return noteListResult;

答案 3 :(得分:0)

请尝试使用具有NamedParameterJdbcTemplate的MapSqlParameterSource。

MapSqlParameterSource parameters = new MapSqlParameterSource();
    parameters.addValue("array", inputarray);
    NamedParameterJdbcTemplate jdbctemplate = new NamedParameterJdbcTemplate(
            this.jdbcTemplate.getDataSource());

查询中

IN(:array)