Java中使用RowMapper映射查询结果时出现无效列名错误
解决RowMapper映射时“无效列名”的问题
核心原因
你的SQL外层查询中,对TEMP.SUMCARD、TEMP.SUMERRORTXN、TEMP.SUMERRORTXNCARD进行聚合后未指定别名,导致ResultSet返回的列名并非RowMapper中使用的SUMCARD、SUMERRORTXN、SUMERRORTXNCARD,而是类似SUM(TEMP.SUMCARD)的表达式或数据库自动生成的列名(如COLUMN_2),因此触发“无效列名”错误。
修改后的SQL
为外层SELECT的聚合列添加别名,与内层查询的别名保持一致:
SELECT TEMP.SUMALLTXN, SUM(TEMP.SUMCARD) AS SUMCARD, SUM(TEMP.SUMERRORTXN) AS SUMERRORTXN, SUM(TEMP.SUMERRORTXNCARD) AS SUMERRORTXNCARD FROM (SELECT SUM(COUNT(*)) OVER() AS SUMALLTXN, COUNT(mdmtxn.BIN) OVER (PARTITION BY mdmtxn.BIN) AS SUMCARD, SUM(case when mdmtxn.MDSTATUS NOT IN ('1','9', '60') then 1 else 0 end) AS SUMERRORTXN, SUM(case when mdmtxn.MDSTATUS NOT IN ('1','9', '60') then 1 else 0 end) OVER (PARTITION BY mdmtxn.BIN) AS SUMERRORTXNCARD FROM MDM59.MDMTRANSACTION2 mdmtxn WHERE mdmtxn.CREATEDDATE < TO_CHAR(SYSDATE - INTERVAL ':initialMinuteParameterValue' MINUTE ,'YYYYMMDD HH24:MI:SS') AND mdmtxn.CREATEDDATE > TO_CHAR(SYSDATE - INTERVAL ':intervalMinuteParameterValue' MINUTE ,'YYYYMMDD HH24:MI:SS') GROUP BY mdmtxn.MDSTATUS, mdmtxn.BIN ) TEMP GROUP BY TEMP.SUMALLTXN
额外排查建议
- 验证参数替换逻辑:检查
setTotalTransactionsSql方法中的字符串替换是否生成了合法SQL(比如替换后的INTERVAL值为纯数字,无多余引号)。 - 查看实际列名:可在RowMapper中临时打印ResultSet元数据,确认返回的列名细节:
ResultSetMetaData metaData = rs.getMetaData(); for (int i = 1; i <= metaData.getColumnCount(); i++) { System.out.println("实际列名:" + metaData.getColumnName(i)); }
内容的提问来源于stack exchange,提问作者xprop
相关产品推荐
相关产品推荐

