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

Che*_*ech 10 jdbctemplate

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

SELECT * FROM table WHERE field IN (?)
Run Code Online (Sandbox Code Playgroud)

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

Long id = getJdbcTemplate().queryForLong(query, new Object[]{fieldIds});
Run Code Online (Sandbox Code Playgroud)

Spring Documentation声明除了生成所需数量的"?"之外,没有办法做到这一点.占位符以匹配参数List的大小.有解决方法吗?

Che*_*ech 48

使用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);
Run Code Online (Sandbox Code Playgroud)

但是,这对于您可以在列表中传递的参数数量有潜在的灾难性限制,这取决于您使用的数据库.

希望这有用......

  • @janwen的限制与您可以传递给IN子句的参数数量有关,通常限制为1000,但正如我所说,这取决于数据库.1000是相当高的,所以在大多数情况下你应该没事,这可能是你的情况 (2认同)

bma*_*ies 3

我认为您不能将其作为单个“?”来完成。它与 Spring JDBC 模板无关,它是核心 SQL。

您必须根据需要为尽可能多的对象建立 (?, ?, ?) 。