Jakarta ee 如何将RowSetDynaClass与Spring RowMapper一起使用来检索ResultSet的所有行?

Jakarta ee 如何将RowSetDynaClass与Spring RowMapper一起使用来检索ResultSet的所有行?,jakarta-ee,spring-jdbc,Jakarta Ee,Spring Jdbc,我的Oracle数据库中有一个存储过程,它返回一个游标,工作正常。我想在Java中检索游标的数据,而不需要任何对象持久性。我唯一的目标就是把它显示在屏幕上。因为我将有几十个存储过程,并且我不想创建一个新的对应于每个存储过程的行映射器,所以我尝试使用RowSetDynaClass 我将Spring StoredProcess对象子类化如下: public abstract class AbstractReport extends StoredProcedure { public stat

我的Oracle数据库中有一个存储过程,它返回一个游标,工作正常。我想在Java中检索游标的数据,而不需要任何对象持久性。我唯一的目标就是把它显示在屏幕上。因为我将有几十个存储过程,并且我不想创建一个新的对应于每个存储过程的行映射器,所以我尝试使用RowSetDynaClass

我将Spring StoredProcess对象子类化如下:

public abstract class AbstractReport extends StoredProcedure {

    public static final String KEY_REPORT_RESULT = "profiles";

    public AbstractReport(DataSource dataSource, String sprocName) {
        super(dataSource, sprocName);
        declareParameter(new SqlOutParameter(
                KEY_REPORT_RESULT,
                oracle.jdbc.OracleTypes.CURSOR,
                new RowMapper() {
                    public RowSetDynaClass mapRow(ResultSet argResults, int argRowNum ) throws SQLException {
                        return new RowSetDynaClass(argResults);
                    }
                })
        );
//      declareParameter(new SqlOutParameter(
//              "test",
//              oracle.jdbc.OracleTypes.CURSOR,
//              new RowMapper() {
//                  public String[] mapRow(ResultSet argResults, int argRowNum ) throws SQLException {
//                      return new String[]{argResults.getString(1), argResults.getString(2), argResults.getString(3)};
//                  }
//              })
//        );
        compile();
    }

    @SuppressWarnings("unchecked")
    public Map<String, Object> computeReport(Map<String, Object> params){
        return super.execute(params);
    }
...

}
public List<String[]> computeReport(Map<String, Object> params, ReportEnum report) throws EptServiceException {
        List<String[]> result;

        try {
            logger.debug("Computing report " + report);
            AbstractReport procedure = getReport(report);

            Map<String, Object> rawResult = procedure.computeReport(params);
            logger.info("rawResult:" + rawResult);
            result = generateReportOutput(rawResult);
        } catch (EptServiceException e) {
            throw e;
        } catch (Exception e) {
            logger.error("Error while computing report:" + report, e);
            throw new EptServiceException(EsbPortalError.ERROR_PORTAL_UNKNOWN, e);
        }

        return result;
    }
公共抽象类AbstractReport扩展了StoredProcess{
公共静态最终字符串KEY\u REPORT\u RESULT=“profiles”;
public AbstractReport(数据源数据源字符串存储过程名称){
super(数据源,存储过程名称);
declareParameter(新SqlOutParameter(
关键报告结果,
oracle.jdbc.OracleTypes.CURSOR,
新的行映射器(){
公共RowSetDynaClass mapRow(ResultSet argResults,int argRowNum)引发SQLException{
返回新的RowSetDynaClass(argResults);
}
})
);
//declareParameter(新SqlOutParameter(
//“测试”,
//oracle.jdbc.OracleTypes.CURSOR,
//新的行映射器(){
//公共字符串[]mapRow(ResultSet argResults,int argRowNum)引发SQLException{
//返回新字符串[]{argResults.getString(1),argResults.getString(2),argResults.getString(3)};
//                  }
//              })
//        );
编译();
}
@抑制警告(“未选中”)
公共地图计算机端口(地图参数){
返回super.execute(params);
}
...
}
这叫做:

public abstract class AbstractReport extends StoredProcedure {

    public static final String KEY_REPORT_RESULT = "profiles";

    public AbstractReport(DataSource dataSource, String sprocName) {
        super(dataSource, sprocName);
        declareParameter(new SqlOutParameter(
                KEY_REPORT_RESULT,
                oracle.jdbc.OracleTypes.CURSOR,
                new RowMapper() {
                    public RowSetDynaClass mapRow(ResultSet argResults, int argRowNum ) throws SQLException {
                        return new RowSetDynaClass(argResults);
                    }
                })
        );
//      declareParameter(new SqlOutParameter(
//              "test",
//              oracle.jdbc.OracleTypes.CURSOR,
//              new RowMapper() {
//                  public String[] mapRow(ResultSet argResults, int argRowNum ) throws SQLException {
//                      return new String[]{argResults.getString(1), argResults.getString(2), argResults.getString(3)};
//                  }
//              })
//        );
        compile();
    }

    @SuppressWarnings("unchecked")
    public Map<String, Object> computeReport(Map<String, Object> params){
        return super.execute(params);
    }
...

}
public List<String[]> computeReport(Map<String, Object> params, ReportEnum report) throws EptServiceException {
        List<String[]> result;

        try {
            logger.debug("Computing report " + report);
            AbstractReport procedure = getReport(report);

            Map<String, Object> rawResult = procedure.computeReport(params);
            logger.info("rawResult:" + rawResult);
            result = generateReportOutput(rawResult);
        } catch (EptServiceException e) {
            throw e;
        } catch (Exception e) {
            logger.error("Error while computing report:" + report, e);
            throw new EptServiceException(EsbPortalError.ERROR_PORTAL_UNKNOWN, e);
        }

        return result;
    }
public List computeReport(映射参数、报告枚举报告)引发EptServiceException{
列出结果;
试一试{
logger.debug(“计算报告”+报告);
AbstractReport过程=getReport(报告);
Map rawResult=过程.计算机端口(参数);
logger.info(“rawResult:+rawResult”);
结果=generateReportOutput(rawResult);
}catch(EptServiceException){
投掷e;
}捕获(例外e){
logger.error(“计算报告时出错:”+报告,e);
抛出新的EptServiceException(EsbPortalError.ERROR\u PORTAL\u未知,e);
}
返回结果;
}
所有这些工作几乎完美,除了我在结果中遗漏了一行。。。 在SQL中执行存储过程时,有3个结果。 如果我使用一个简单的行映射器,如上面评论中的那个,我有3个结果

但是如果我使用RowSetDynaClass,我会得到一个包含2行的对象,而不是预期的3行。我知道这没有多大意义(至少对我来说没有),但我肯定遗漏了一些愚蠢的东西

我做错了什么?

我终于明白了(大部分)。我找不到使用RowMapper接口使其工作的方法。因此,我使用ResultSetTextRactor对象如下:

declareParameter(new SqlOutParameter(
            KEY_REPORT_RESULT,
            oracle.jdbc.OracleTypes.CURSOR,
            new ResultSetExtractor() {

                @Override
                public Object extractData(ResultSet rs) throws SQLException,
                        DataAccessException {
                    return new RowSetDynaClass(rs);
                }
            })
);
这输出了我所期望的三个正确结果。至于为什么RowMapper不起作用,但这个我不知道