当前位置: 首页 > 知识库问答 >
问题:

SQL查询未通过JdbcTemplate运行的问题

益泰平
2023-03-14

我遇到了一个奇怪的问题,使用Oracle Pivot语法的sql查询。我可以毫无问题地在SqlDeveloper中运行查询;然而,使用行映射器通过JdbcTemplate运行它会产生关于无效列名的奇怪错误。

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar ... nested exception is java.sql.SQLException: Invalid column name

SQL语句:

select * from ( 
    Select stat.SWRHXML_HXPS_CODE  
    FROM Swbhxml xml 
    LEFT JOIN Swrhxml stat ON stat.swrhxml_trans_id = xml.SWBHXML_TRANS_ID 
    WHERE stat.SWRHXML_ACTIVITY_DATE = (
        SELECT MAX(st.SWRHXML_ACTIVITY_DATE) 
        FROM swrhxml st 
        WHERE stat.SWRHXML_TRANS_ID = st.SWRHXML_TRANS_ID)
   ) pivot (count(SWRHXML_HXPS_CODE) 
       for SWRHXML_HXPS_CODE in 
        ('NEW','EXPORT_READY','PENDING_MATCH','MATCHED_ID','PROCESSED','REJECTED'));

行映射器:

public class TranscriptStatusCountRowMapper implements RowMapper {

    @Override
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {

        TranscriptStatusCounts tsc = new TranscriptStatusCounts();

        tsc.setNewCount(rs.getLong("NEW_RECORDS"));
        tsc.setExportReadyCount(rs.getLong("EXPORT_READY"));
        tsc.setPendingMatchCount(rs.getLong("PENDING_MATCH"));
        tsc.setMatchedIdCount(rs.getLong("MATCHED_ID"));
        tsc.setProcessedCount(rs.getLong("PROCESSED"));
        tsc.setRejectedCount(rs.getLong("REJECTED"));
        return tsc;
    }
}

DAO调用类:

@Repository("transcriptCountDao")
public class TranscriptCountDaoImpl extends BaseDaoImpl implements   TranscriptCountDao {

    private static final Logger logger =    Logger.getLogger(TranscriptCountDaoImpl.class);

    @Override
    public TranscriptStatusCounts findTranscriptStatusCount() {
        logger.debug("Getting counts of Transcripts status in system"); 
        String sql =  "...sql posted above..."
        TranscriptStatusCounts tsc = 
            (TranscriptStatusCounts) getJdbcTemplate().queryForObject(sql, new TranscriptStatusCountRowMapper());   
        return tsc;
    }
}

共有1个答案

彭成天
2023-03-14

好吧…我想好了。。。

数据透视表的列并没有很好地映射到我的行映射器。因此,我将行映射器更改为以下内容,从而解决了问题:

TranscriptStatusCounts tsc = new TranscriptStatusCounts();
    //'NEW','EXPORT_READY','PENDING_MATCH','MATCHED_ID','PROCESSED','REJECTED'
    tsc.setNewCount(rs.getLong(1));
    tsc.setExportReadyCount(rs.getLong(2));
    tsc.setPendingMatchCount(rs.getLong(3));
    tsc.setMatchedIdCount(rs.getLong(4));
    tsc.setProcessedCount(rs.getLong(5));
    tsc.setRejectedCount(rs.getLong(6));
    return tsc;

我忘记了sql“无效的列名”错误也可以引用结果集中用于访问列的名称。由于 PIVOT 查询对它们进行排序,因此我可以仅使用列的编号来获取结果。

 类似资料:
  • 下面的NodeJS应用程序在没有process.exit()的情况下运行得非常好,当我添加process.exit()时,它在执行后关闭窗口(这是我想要的),但它不执行SQL查询。 上面代码不会插入到MySQL中 如果删除process.exit(0),它将插入MySQL

  • 问题内容: 在Spring jdbc模板调用中,是否可以从SQL插入中获取@@ identity?如果是这样,怎么办? 问题答案: 该方法已重载,以获取一个名为GeneratedKeyHolder的对象,您可以使用该对象来检索自动生成的密钥。例如(从此处获取的代码):

  • 问题内容: 在Spring jdbc模板调用中,是否可以从SQL插入中获取@@ identity?如果是这样,怎么办? 问题答案: 该方法已重载,以获取一个称为GeneratedKeyHolder的对象,你可以使用该对象来检索自动生成的密钥。例如:

  • 问题内容: 我正在使用R包通过R访问我的PostgreSQL数据库(9.3)。我有一些非常长且较大的sql查询(从raster2pgsql生成的几个MB大。)。 如何在R中以语句形式发送/执行sql查询文件? 正常方式 似乎无法通过来工作。我试图通过读取整个sql文件作为字符向量,但是这也失败了,因为dbSendQuery显然仅支持单个命令? 问题答案: 或仅用于“ SQL”部分,而不是psql命

  • 问题内容: 我想知道是否有更优雅的方法来使用Spring的JDBCTemplate进行IN()查询。目前,我正在执行以下操作: 这是很痛苦的,因为如果我只有九行用于构建IN()查询的子句。我想要类似预准备语句的参数替换 问题答案: 你需要一个参数源: 仅当返回类型的实例时,此方法才有效NamedParameterJdbcTemplate

  • 问题内容: 我有以下查询: 我想为该选项命名时如何更改标题。 问题答案: 使用这样的别名: 如果要更改列名,则不仅要为此查询使用,而且通常要使用ALTER TABLE