gpt4 book ai didi

java - JDBCTemplate 未给出带有参数的适当结果

转载 作者:行者123 更新时间:2023-12-02 05:50:36 26 4
gpt4 key购买 nike

我正在使用 NamedParameterJdbcTemplate 在 Oracle 中运行 SQL。在 Oracle 数据库中运行时,在 SQL Developer 中传递参数时,它运行得绝对正常,但在使用 JdbcTemplate

时,它会给出嵌套异常
java.sql.SQLSyntaxErrorException: ORA-00979: not a GROUP BY expression

我通过 map 传递参数,如下所示。

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 对象的数组。

最佳答案

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));

});

关于java - JDBCTemplate 未给出带有参数的适当结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56052535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com