JDBCTemplate 没有给出带有参数的适当结果

JDBCTemplate not giving appropriate result with parameters

我在 Oracle 中使用 NamedParameterJdbcTemplate 到 运行 a SQL。 运行 在 Oracle 数据库中 运行 时绝对没问题,同时在 SQL 开发人员中传递参数,但在使用 JdbcTemplate[=20= 时会出现嵌套异常]

java.sql.SQLSyntaxErrorException: ORA-00979: not a GROUP BY expression

我正在通过下面给出的地图传递参数。

select to_char(c.created_dt, :GROUP_FORMAT) as point
      ,count(*) as CNT
  from tableA c
 where trunc(c.created_dt) >= to_date(:START_DATE,'YYYY-MM-DD')
   and trunc(c.created_dt) <= to_date(:END_DATE,'YYYY-MM-DD')
 group by to_char(c.created_dt, :GROUP_FORMAT)

return jdbcTemplate.query(sql,
         ImmutableMap.<String, Object>builder()
           .put("GROUP_FORMAT", groupFormat)
           .put("END_DATE", Date.valueOf(endDate))                                                                  
           .put("START_DATE", Date.valueOf(startDate))
           .build(), (rs, rowNum) -> {
             ClassToMap data = ClassToMap.builder().point(rs.getString(1)).count(rs.getInt(2)).build();
             return data;});

问题主要与 GROUP_FORMAT 参数有关,已验证硬编码 GROUP_FORMAT 并且工作正常。传递的 GROUP_FORMAT 的值将是 'YYYYMMDD''YYYYMM'

预期输出是 ClassToMap 个对象的数组。

这个问题与racraman在评论中分享的相同。更改 SQL 以仅在一处接受参数解决了问题

JdbcTemplate 不只是进行字符串连接,而是对参数进行包装。因此,您将无法将它们传递给 'synthetic' 表达式,例如 'to_char'。 或者,您可以按相同的未格式化列分组,这应该会给您相同的结果。

我已经使用以下代码测试了它:

String groupFormat = "YYYYMMDD";

String sql = "select c.created_dt, to_char(c.created_dt, :groupFormat) as point" + 
        "      ,count(*) as CNT" + 
        "  from your_table c" + 
        " group by c.created_dt";

MapSqlParameterSource namedParameters = new MapSqlParameterSource();
namedParameters.addValue("groupFormat", groupFormat);

dbSelector.gssNamedJdbcTemplate().query(sql, namedParameters, rs -> {
    logger.info(rs.getString(1));

});