使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常

Posted

技术标签:

【中文标题】使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常【英文标题】:Get PSQL Exception when passing List<String> as a Query parameter in "IN" clause using JDBCTemplate 【发布时间】:2019-11-15 18:09:37 【问题描述】:

我正在使用PostgreSQL 数据库创建Spring Boot 应用程序。我正在使用JDBCTemplate 来执行数据库操作。根据我的要求,我想要来自CONTRACT_VIEW_2 表的rowcount,其中LICENSE_PLATE = "xxxxxx"ZONE_CODE is IN ("x","y","z") 的值但我得到了PSQL 异常。

我尝试使用 MapSQLParameterSource,但仍然遇到问题。

@Override
public Integer getAllZoneForLp(String lp,List<String> zones) 
  MapSqlParameterSource zoneIds = new MapSqlParameterSource();
  zoneIds.addValue("zoneIds",zones);
  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = ? and zone_code IN (?)";
  return jdbcTemplate.queryForObject(sql,Integer.class,lp,zoneIds);

我希望结果中出现row count,但我得到的是PSQL Exception。我附上了我得到的异常的图像。

提前致谢。

【问题讨论】:

【参考方案1】:

您的问题是您已将Namedparameter 添加到JdbcTemplate

所以如果你使用NamedParameterJdbcTemplate

@Override
public Integer getAllZoneForLp(String lp,List<String> zones) 
  MapSqlParameterSource parameters = new MapSqlParameterSource();
  parameters.addValue("lp", lp);
  parameters.addValue("zoneIds",zones);
  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = :lp and zone_code IN (:zoneIds)";
  NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);

  return namedParameterJdbcTemplate.queryForObject(sql, parameters, Integer.class);

如果你想使用jdbcTemplate

@Override
public Integer getAllZoneForLp(String lp,List<String> zones) 
  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = ? and zone_code IN (?)";

  return jdbcTemplate.queryForObject(sql, Integer.class, new Object[]  lp, zones); 

使用NameParameterJdbcTemplate,这样您就不会错过任何参数。

【讨论】:

【参考方案2】:

请将您的查询更改为

  String sql = "select " +
        "count(*) " +
        "from contract_view_2 " +
        "where license_plate = ? and zone_code IN (:zoneIds)";

变化:改变了?到 :zoneIds

zoneIds.addValue("zoneIds",zones); 行正在使用命名参数绑定它。

【讨论】:

以上是关于使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常的主要内容,如果未能解决你的问题,请参考以下文章

具有可变长度 IN 子句的 JDBC 更新 [重复]

PL/SQL - 如何在 IN 子句中使用数组

将数组转换为 WHERE IN mysql 子句的格式

有没有办法在 SQL 中将 EXCEPT 语句重写为 NOT IN 语句?

如何使用 Spring 的 JDBCTemplate 有效地执行 IN() SQL 查询?

jdbcTemplate中向in语句传参