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));
});
我在 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));
});