JDBCTemplate没有给参数提供适当的结果

时间:2019-05-09 05:07:08

标签: java spring-jdbc

我正在使用NamedParameterJdbcTemplate在Oracle中运行SQL。在Oracle数据库中运行时,在SQL开发人员中传递参数时,它运行得非常好,但是在使用JdbcTemplate

时,它提供了一个嵌套异常。
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个对象的数组。

2 个答案:

答案 0 :(得分:0)

该问题与racraman在评论中分享的问题相同。更改SQL以仅在一个地方接受参数可以解决此问题

答案 1 :(得分:0)

JdbcTemplate不仅可以进行字符串连接,还可以对参数进行包装。因此,您将无法将它们传递给“ 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));

});