我正在使用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
个对象的数组。
答案 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));
});