Jakarta ee 如何将RowSetDynaClass与Spring RowMapper一起使用来检索ResultSet的所有行?
我的Oracle数据库中有一个存储过程,它返回一个游标,工作正常。我想在Java中检索游标的数据,而不需要任何对象持久性。我唯一的目标就是把它显示在屏幕上。因为我将有几十个存储过程,并且我不想创建一个新的对应于每个存储过程的行映射器,所以我尝试使用RowSetDynaClass 我将Spring StoredProcess对象子类化如下: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
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不起作用,但这个我不知道