如何查询 NamedJdbcTemplate 中的单个列?

How to query for a single column in NamedJdbcTemplate?

如何使用 namedParameterJdbcTemplate 查询整数列表?我试过按照这个模板,它在下面不起作用。

String customerName = "JOE";
MapSqlParameterSource customerParameters = new MapSqlParameterSource();
customerParameters.addValue("CustomerName", customerName);

private static final String query = "SELECT Customer_Id From dbo.Customers WHERE Customer_Name = :CustomerName";

List<Integer> data = namedParameterJdbcTemplate.queryForList(query, Integer.class);

Error: Cannot resolve method 'queryForList(java.lang.String, java.lang.Class<java.lang.Integer>)'

为什么代码报错

docs queryForList 方法中所述,有以下可用实现:

  1. queryForList(String sql, Map<String,?> paramMap).
  2. queryForList(String sql, Map<String,?> paramMap, Class<T> elementType)
  3. queryForList(String sql, SqlParameterSource paramSource)
  4. queryForList(String sql, SqlParameterSource paramSource, Class<T> elementType)

None 这些实现与给定实现中使用的参数相匹配。因此,我们最终得到这个错误:

Error: Cannot resolve method 'queryForList(java.lang.String, java.lang.Class<java.lang.Integer>)'

传递缺失参数背后的想法

传递 MapParameterSource 背后的关键思想是进行动态查询,稍后我们可以在其中输入值。

例如:

    String query = "Select :columnName from table";
    Map<String,String> map = new HashMap<>();  
    map.put("columnName", "userName");  

当此地图与 query String 一起传递时,它在内部用于用地图中的值替换占位符。

如何修复代码

有两种方法可以解决此问题:

  1. 直接传null

这不是解决问题的最佳方法,绝对不推荐用于生产代码。但是,如果查询字符串中没有占位符,则可以使用它。 代码:

List<Integer> data = namedParameterJdbcTemplate.queryForList(query, null, Integer.class);
  1. 创建并传递一个空的 MapSqlParameterSource

您的代码中已经有一个名为 customerParametersMapSqlParameterSource。只需在调用 queryForList() 时传递它 代码:

List<Integer> data = namedParameterJdbcTemplate.queryForList(query, customerParameters, Integer.class);