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

11

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

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

然而,如果我决定像以下这样使用命名参数来查询 -

int userOrderCount = getNamedParameterJdbcTemplate()
    .queryForInt(
         "SELECT COUNT(orderid) FROM orders WHERE useridfk_order = :userId AND restaurantidfk_order = :restaurantId", 
         new MapSqlParameterSource(":restaurantId", restaurantId)
             .addValue(":userId", userId)
    );
我收到了这个异常 -
org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'userId': No value registered for key 'userId'.

我知道那个黄金格言,即“不破坏它,如果它没有问题的话”。

但是,我还是忍不住想知道为什么会发生这种情况?

1个回答

33

使用这个。

new MapSqlParameterSource("restaurantId", restaurantId)
    .addValue("userId", userId);

不要这样做。

new MapSqlParameterSource(":restaurantId", restaurantId)
    .addValue(":userId", userId);

4
(+1) 正确:为了让读者更清楚,您在地图参数前面不能有那个“:”。 - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接