如何将多个命名参数传递给Spring JdbcTemplate?

Mon*_*ael 9 java database spring jdbc

我在Spring Dao中有以下代码可以正常工作 -

Object args[] = { userId, restaurantId };
int userOrderCount = getJdbcTemplate()
    .queryForInt(
         "SELECT COUNT(orderid) FROM orders WHERE useridfk_order = ? AND restaurantidfk_order = ?", 
         args
    );
Run Code Online (Sandbox Code Playgroud)

但是,如果我决定使用NamedParameters作为我的查询,如下所示 -

int userOrderCount = getNamedParameterJdbcTemplate()
    .queryForInt(
         "SELECT COUNT(orderid) FROM orders WHERE useridfk_order = :userId AND restaurantidfk_order = :restaurantId", 
         new MapSqlParameterSource(":restaurantId", restaurantId)
             .addValue(":userId", userId)
    );
Run Code Online (Sandbox Code Playgroud)

我得到这个例外 -

org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'userId': No value registered for key 'userId'.
Run Code Online (Sandbox Code Playgroud)

我知道金色的格言"如果没有破坏就不要修理它".

但是,我仍然不禁想知道为什么会这样?

eri*_*urk 26

用这个.

new MapSqlParameterSource("restaurantId", restaurantId)
    .addValue("userId", userId);
Run Code Online (Sandbox Code Playgroud)

而不是这个.

new MapSqlParameterSource(":restaurantId", restaurantId)
    .addValue(":userId", userId);
Run Code Online (Sandbox Code Playgroud)

  • (+1) 正确:为了让读者更清楚:你不能在 map 参数前面有那个 `:` (3认同)