这是我第一次使用JDBCTemplates,我遇到了一个需要使用如下查询的情况:
SELECT * FROM table WHERE field IN (?)
我该怎么做?我已经尝试传递一个列表/数组值但是没有做到这一点,我得到了一个异常。我目前的代码如下:
Long id = getJdbcTemplate().queryForLong(query, new Object[]{fieldIds});
Spring Documentation表示除了生成所需数量的“?”之外没有办法做到这一点。占位符以匹配参数List的大小。有解决方法吗?
答案 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)